PolarDB for PostgreSQL (Compatible with Oracle) には、DBMS_STATSパッケージが用意されており、データベースの実行に関する統計の収集、生成された統計のバックアップ、統計の復元に役立ちます。 統計バックアップのカスタム時点を指定し、必要に応じてテーブル統計を変更できます。 このようにして、オプティマイザは正確な実行計画を生成できます。
前提条件
DBMS_STATSパッケージを使用する場合は、お問い合わせください。
テストデータの準備
テストデータは、このトピックで提供されている例にのみ適用されます。
dbms_stats_schema
という名前のスキーマを作成します。CREATE SCHEMA dbms_stats_schema;
dbms_stats_test
という名前のテーブルを作成します。CREATE TABLE dbms_stats_schema.dbms_stats_test(id int);
インデックスを作成します。
CREATE INDEX dbms_stats_index on dbms_stats_schema.dbms_stats_test(id);
データを挿入します。
INSERT INTO dbms_stats_schema.dbms_stats_test values (generate_series(1,10000));
DBMS_STATS.GATHER_SCHEMA_STATS
この関数は、スキーマ統計の収集とバックアップに使用されます。
構文
DBMS_STATS.GATHER_SCHEMA_STATS (
ownname VARCHAR2
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | 分析するスキーマの名前を指定します。 | 可 |
例
スキーマ統計を収集してバックアップします。 例:
CALL DBMS_STATS.GATHER_SCHEMA_STATS('dbms_stats_schema');
スキーマ統計のバックアップステータスを照会します。 例:
SELECT * FROM polar_dbms_stats.backup_history;
DBMS_STATS.GATHER_TABLE_STATS
この関数は、テーブル統計の収集とバックアップに使用されます。
構文
DBMS_STATS.GATHER_TABLE_STATS (
ownname VARCHAR2,
tabname VARCHAR2
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | 分析するテーブルのスキーマを指定します。 | 可 |
タブ名 | 分析するテーブルの名前を指定します。 | 可 |
例
テーブル統計を収集してバックアップします。 例:
CALL DBMS_STATS.GATHER_TABLE_STATS('dbms_stats_schema', 'dbms_stats_test');
バックアップ統計を照会します。 例:
SELECT * FROM polar_dbms_stats.backup_history;
DBMS_STATS.GATHER_DATABASE_STATS
この関数は、データベース統計の収集とバックアップに使用されます。
構文
DBMS_STATS.GATHER_DATABASE_STATS ();
例
データベース統計を収集してバックアップします。 例:
CALL DBMS_STATS.GATHER_DATABASE_STATS();
バックアップ統計を照会します。 例:
SELECT * FROM polar_dbms_stats.backup_history;
DBMS_STATS.GATHER_INDEX_STATS
この関数は、インデックス統計の収集とバックアップに使用されます。
構文
DBMS_STATS.GATHER_INDEX_STATS (
ownname VARCHAR2,
indname VARCHAR2
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | 分析するインデックスのスキーマを指定します。 | 可 |
indname | 分析するインデックスの名前を指定します。 | 可 |
例
インデックス統計を収集してバックアップします。 例:
CALL DBMS_STATS.GATHER_INDEX_STATS('dbms_stats_schema', 'dbms_stats_index');
バックアップ統計を照会します。 例:
SELECT * FROM polar_dbms_stats.backup_history;
DBMS_STATS.GATHER_COLUMN_STATS
この関数は、指定した列の統計を収集してバックアップするために使用されます。
構文
DBMS_STATS.GATHER_COLUMN_STATS (
ownname VARCHAR2,
tablename VARCHAR2,
attname TEXT
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | 分析する列のスキーマを指定します。 | 可 |
tablename | 分析する列を含むテーブルの名前を指定します。 | 可 |
attname | 分析する列の名前を指定します。 | 可 |
例
指定した列の統計を収集してバックアップします。 例:
CALL DBMS_STATS.GATHER_COLUMN_STATS('dbms_stats_schema', 'dbms_stats_test', 'id');
列統計のバックアップステータスを照会します。 例:
SELECT * FROM polar_dbms_stats.backup_history;
DBMS_STATS.RESTORE_SCHEMA_STATS
この関数は、指定したスキーマの統計を復元するために使用されます。
構文
DBMS_STATS.RESTORE_SCHEMA_STATS (
ownname VARCHAR2,
as_of_timestamp TIMESTAMP WITH TIME ZONE
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | 復元するスキーマの名前を指定します。 | 可 |
as_of_timestamp | 統計を復元する時点を指定します。 | 可 |
例
指定したスキーマの統計を復元します。 例:
SELECT DBMS_STATS.RESTORE_SCHEMA_STATS('dbms_stats_schema',time) FROM polar_dbms_stats.backup_history WHERE unit='s';
復元された統計を照会します。 例:
SELECT count(*) FROM polar_dbms_stats.relation_stats_locked WHERE relname LIKE 'dbms_stats_schema%';
DBMS_STATS.RESTORE_DATABASE_STATS
この関数は、データベース統計を復元するために使用されます。
構文
DBMS_STATS.RESTORE_DATABASE_STATS (
as_of_timestamp TIMESTAMP WITH TIME ZONE
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
as_of_timestamp | 統計を復元する時点を指定します。 | 可 |
例
データベース統計を復元します。 例:
SELECT DBMS_STATS.RESTORE_DATABASE_STATS(time) FROM polar_dbms_stats.backup_history WHERE unit='d';
復元された統計を照会します。 例:
SELECT count(*) FROM polar_dbms_stats.relation_stats_locked WHERE relname LIKE 'dbms_stats_schema%';
DBMS_STATS.RESTORE_TABLE_STATS
この関数は、指定されたテーブルの統計を復元するために使用されます。
構文
DBMS_STATS.RESTORE_TABLE_STATS (
ownname VARCHAR2,
tabname VARCHAR2,
as_of_timestamp TIMESTAMP WITH TIME ZONE
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | 復元するテーブルのスキーマを指定します。 | 可 |
tabname | 復元するテーブルの名前を指定します。 | 可 |
as_of_timestamp | 統計を復元する時点を指定します。 | 可 |
例
指定したテーブルの統計を復元します。 例:
SELECT DBMS_STATS.RESTORE_TABLE_STATS('dbms_stats_schema', 'dbms_stats_test', time) FROM polar_dbms_stats.backup_history WHERE unit='t';
復元された統計を照会します。 例:
SELECT count(*) FROM polar_dbms_stats.relation_stats_locked WHERE relname LIKE 'dbms_stats_schema%';
DBMS_STATS.RESTORE_COLUMN_STATS
この関数は、指定した列の統計を復元するために使用されます。
構文
DBMS_STATS.RESTORE_COLUMN_STATS (
ownname TEXT,
tablename TEXT,
attname TEXT,
as_of_timestamp timestamp with time zone
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | 復元する列のスキーマを指定します。 | 可 |
tabname | 復元する列を含むテーブルの名前を指定します。 | 可 |
attname | 復元する列の名前を指定します。 | 可 |
as_of_timestamp | 統計を復元する時点を指定します。 | 可 |
例
指定した列の統計を復元します。 例:
SELECT DBMS_STATS.RESTORE_COLUMN_STATS('dbms_stats_schema', 'dbms_stats_test', 'id', time) FROM polar_dbms_stats.backup_history WHERE unit='c';
復元された統計を照会します。 例:
SELECT count(*) FROM polar_dbms_stats.relation_stats_locked WHERE relname LIKE 'dbms_stats_schema%';
DBMS_STATS.PURGE_STATS
この関数は、指定された時点より前に生成されたバックアップ統計を削除するために使用されます。
構文
DBMS_STATS.PURGE_STATS (
before_timestamp timestamp
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
before_timestamp | 指定された時点を指定します。 システムは、指定された時点より前に生成された統計を削除します。 | 可 |
例
指定した時点より前に生成されたバックアップ統計を削除します。 例:
SELECT DBMS_STATS.PURGE_STATS(time) FROM polar_dbms_stats.backup_history WHERE unit='c';
DBMS_STATS.SET_TABLE_STATS
この関数は、指定されたテーブルの統計を設定するために使用されます。
SET_TABLE_STATS関数を呼び出してテーブルの統計を設定する前に、テーブルの統計が収集されていることを確認してください。 テーブル統計が収集されない場合は、GATHEER_SCHEMA_STATSまたはGATHER_TABLE_STATS関数を呼び出して統計を収集します。
構文
DBMS_STATS.SET_TABLE_STATS (
ownname VARCHAR2,
tabname VARCHAR2,
numrows NUMBER DEFAULT NULL,
numblks NUMBER DEFAULT NULL
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | 設定するテーブルのスキーマを指定します。 | 可 |
tabname | 設定するテーブルの名前を指定します。 | 可 |
numrows | テーブルの行数を指定します。 | 可 |
numblks | テーブルのブロック数を指定します。 | 可 |
例
テーブル統計を設定します。 例:
CALL DBMS_STATS.SET_TABLE_STATS('dbms_stats_schema', 'dbms_stats_test', 1234, 4321);
DBMS_STATS.GET_TABLE_STATS
この関数は、指定されたテーブルの統計を照会するために使用されます。
構文
DBMS_STATS.GET_TABLE_STATS (
ownname VARCHAR2,
tabname VARCHAR2,
numrows OUT NUMBER,
numblks OUT NUMBER
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | クエリするテーブルのスキーマを指定します。 | 可 |
tabname | 照会するテーブルの名前を指定します。 | 可 |
numrows | テーブルから照会する行数を指定します。 | 可 |
numblks | テーブルから照会するブロックの数を指定します。 | 可 |
例
テーブル統計のクエリ 例:
DECLARE
numrows integer;
numblks integer;
BEGIN
CALL DBMS_STATS.GET_TABLE_STATS('dbms_stats_schema', 'dbms_stats_test', numrows, numblks);
raise notice '%', numrows;
raise notice '%', numblks;
END;
DBMS_STATS.SET_INDEX_STATS
この関数は、インデックス統計を設定するために使用されます。
構文
DBMS_STATS.SET_INDEX_STATS (
ownname VARCHAR2,
indname VARCHAR2,
numrows NUMBER DEFAULT NULL,
numblks NUMBER DEFAULT NULL
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | 設定するインデックスのスキーマを指定します。 | 可 |
indname | 設定するインデックスの名前を指定します。 | 可 |
numrows | インデックスに設定する行数を指定します。 | 可 |
numblks | インデックスに設定するブロックの数を指定します。 | 可 |
例
インデックス統計を設定します。 例:
CALL DBMS_STATS.SET_INDEX_STATS('dbms_stats_schema', 'dbms_stats_index', 2345, 5432);
DBMS_STATS.GET_INDEX_STATS
この関数は、指定されたインデックスの統計を照会するために使用されます。
構文
DBMS_STATS.GET_INDEX_STATS (
ownname VARCHAR2,
tabname VARCHAR2,
numrows OUT NUMBER,
numblks OUT NUMBER
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | クエリするインデックスのスキーマを指定します。 | 可 |
tabname | クエリするインデックスの名前を指定します。 | 可 |
numrows | インデックスからクエリする行数を指定します。 | 可 |
numblks | インデックスからクエリするブロックの数を指定します。 | 可 |
例
クエリインデックス統計。 例:
DECLARE
numrows integer;
numblks integer;
BEGIN
CALL DBMS_STATS.GET_INDEX_STATS('dbms_stats_schema', 'dbms_stats_index', numrows, numblks);
raise notice '%', numrows;
raise notice '%', numblks;
END;
DBMS_STATS.GET_COLUMN_STATS
この関数は、指定した列の統計を照会するために使用されます。
構文
DBMS_STATS.GET_COLUMN_STATS (
ownname VARCHAR2,
tabname VARCHAR2,
colname VARCHAR2,
distcnt OUT NUMBER,
nullcnt OUT NUMBER,
avgclen OUT NUMBER
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | クエリする列のスキーマを指定します。 | 可 |
tabname | クエリする列を含むテーブルの名前を指定します。 | 可 |
colname | クエリする列の名前を指定します。 | 可 |
distcnt | クエリする列内の個別の値の数を指定します。 | 可 |
nullcnt | クエリする列の空の値の数を指定します。 | 可 |
avgclen | クエリする列の平均の長さを指定します。 | 可 |
例
クエリ列統計。 例:
DECLARE
distcnt integer;
nullcnt integer;
avgclen integer;
BEGIN
CALL DBMS_STATS.GET_COLUMN_STATS('dbms_stats_schema', 'dbms_stats_test', 'id', distcnt, nullcnt, avgclen);
raise notice '%', distcnt;
raise notice '%', nullcnt;
raise notice '%', avgclen;
END;
DBMS_STATS.LOCK_TABLE_STATS
この関数は、使用されているテーブルの統計をロックするために使用されます。
構文
DBMS_STATS.LOCK_TABLE_STATS (
ownname VARCHAR2,
tabname VARCHAR2
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | ロックするテーブルのスキーマを指定します。 | 可 |
tabname | ロックするテーブルの名前を指定します。 | 可 |
例
使用されているテーブルの統計をロックします。 例:
CALL DBMS_STATS.LOCK_TABLE_STATS('dbms_stats_schema', 'dbms_stats_test');
ロックされた統計を照会します。 例:
SELECT count(*) FROM polar_dbms_stats.relation_stats_locked WHERE relname = 'dbms_stats_schema.dbms_stats_test';
DBMS_STATS.UNLOCK_TABLE_STATS
この関数は、使用されているテーブルの統計のロックを解除するために使用されます。
構文
DBMS_STATS.UNLOCK_TABLE_STATS (
ownname VARCHAR2,
tabname VARCHAR2
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | ロックを解除するテーブルのスキーマを指定します。 | 可 |
tabname | ロックを解除するテーブルの名前を指定します。 | 可 |
例
使用されているテーブルの統計のロックを解除します。 例:
CALL DBMS_STATS.UNLOCK_TABLE_STATS('dbms_stats_schema', 'dbms_stats_test');
ロックされた統計を照会します。 例:
SELECT count(*) FROM polar_dbms_stats.relation_stats_locked WHERE relname = 'dbms_stats_schema.dbms_stats_test';
DBMS_STATS.LOCK_SCHEMA_STATS
この関数は、使用されているスキーマの統計をロックするために使用されます。
構文
DBMS_STATS.LOCK_SCHEMA_STATS (
ownname VARCHAR2
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | ロックするスキーマの名前を指定します。 | 可 |
例
使用されているスキーマの統計をロックします。 例:
CALL DBMS_STATS.LOCK_SCHEMA_STATS('dbms_stats_schema');
ロックされた統計を照会します。 例:
SELECT count(*) FROM polar_dbms_stats.relation_stats_locked WHERE relname LIKE 'dbms_stats_schema.%';
DBMS_STATS.UNLOCK_SCHEMA_STATS
この関数は、使用されているスキーマの統計のロックを解除するために使用されます。
構文
DBMS_STATS.UNLOCK_SCHEMA_STATS (
ownname VARCHAR2
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | ロックを解除するスキーマの名前を指定します。 | 可 |
例
使用されているスキーマの統計のロックを解除します。 例:
CALL DBMS_STATS.UNLOCK_SCHEMA_STATS('dbms_stats_schema');
ロックされた統計を照会します。 例:
SELECT count(*) FROM polar_dbms_stats.relation_stats_locked WHERE relname LIKE 'dbms_stats_schema.%';
DBMS_STATS.LOCK_COLUMN_STATS
この関数は、使用されている列の統計をロックするために使用されます。
構文
DBMS_STATS.LOCK_COLUMN_STATS (
ownname VARCHAR2,
tabname VARCHAR2,
attname VARCHAR2
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | ロックする列のスキーマを指定します。 | 可 |
tabname | ロックする列を含むテーブルの名前を指定します。 | 可 |
attname | ロックする列の名前を指定します。 | 可 |
例
使用されている列の統計をロックします。 例:
CALL DBMS_STATS.LOCK_COLUMN_STATS('dbms_stats_schema', 'dbms_stats_test', 'id');
DBMS_STATS.UNLOCK_COLUMN_STATS
この関数は、使用されている列の統計のロックを解除するために使用されます。
構文
DBMS_STATS.UNLOCK_COLUMN_STATS (
ownname VARCHAR2,
tabname VARCHAR2,
attname VARCHAR2
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | ロックを解除する列のスキーマを指定します。 | 可 |
tabname | ロックを解除する列を含むテーブルの名前を指定します。 | 可 |
attname | ロックを解除する列の名前を指定します。 | 可 |
例
使用されている列の統計のロックを解除します。 例:
CALL DBMS_STATS.UNLOCK_COLUMN_STATS('dbms_stats_schema', 'dbms_stats_test', 'id');
DBMS_STATS.DELETE_TABLE_STATS
この関数は、既存のテーブル統計を削除するために使用されます。
構文
DBMS_STATS.DELETE_TABLE_STATS (
ownname VARCHAR2,
tabname VARCHAR2
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | 削除するテーブルのスキーマを指定します。 | 可 |
tabname | 削除するテーブルの名前を指定します。 | 可 |
例
既存のテーブル統計を削除します。 例:
CALL DBMS_STATS.DELETE_TABLE_STATS('dbms_stats_schema', 'dbms_stats_test');
既存のテーブル統計が削除された後にテーブル統計を照会します。 例:
SELECT count(*) FROM polar_dbms_stats.relation_stats_backup WHERE relname = 'dbms_stats_schema.dbms_stats_test';
DBMS_STATS.DELETE_COLUMN_STATS
この関数は、既存の列統計を削除するために使用されます。
構文
DBMS_STATS.DELETE_COLUMN_STATS (
ownname VARCHAR2,
tabname VARCHAR2,
attname VARCHAR2
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | 削除する列のスキーマを指定します。 | 可 |
tabname | 削除する列を含むテーブルの名前を指定します。 | 可 |
attname | 削除する列の名前を指定します。 | 可 |
例
既存の列統計を削除します。 例:
CALL DBMS_STATS.DELETE_COLUMN_STATS('dbms_stats_schema', 'dbms_stats_test', 'id');
DBMS_STATS.DELETE_SCHEMA_STATS
この関数は、既存のスキーマ統計を削除するために使用されます。
構文
DBMS_STATS.DELETE_SCHEMA_STATS (
ownname VARCHAR2
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | 削除するスキーマの名前を指定します。 | 可 |
例
既存のスキーマ統計を削除します。 例:
CALL DBMS_STATS.DELETE_SCHEMA_STATS('dbms_stats_schema');
既存のスキーマ統計が削除された後、スキーマ統計を照会します。 例:
SELECT count(*) FROM polar_dbms_stats.relation_stats_backup WHERE relname LIKE 'dbms_stats_schema.%';
DBMS_STATS.DELETE_INDEX_STATS
この関数は、既存のインデックス統計を削除するために使用されます。
構文
DBMS_STATS.DELETE_INDEX_STATS (
ownname VARCHAR2,
indname VARCHAR2
);
Parameters
パラメーター | 説明 | 必須 / 任意 |
ownname | 削除するインデックスのスキーマを指定します。 | 可 |
indname | 削除するインデックスの名前を指定します。 | 可 |
例
既存のインデックス統計を削除します。 例:
CALL DBMS_STATS.DELETE_INDEX_STATS('dbms_stats_schema', 'dbms_stats_index');
既存のインデックス統計が削除された後のクエリインデックス統計。 例:
SELECT count(*) FROM polar_dbms_stats.relation_stats_backup WHERE relname LIKE 'dbms_stats_schema.%';