統計情報の履歴管理機能とは、統計情報の状態が変更された場合(統計情報の再収集、設定、削除、インポート、ロックなど)、変更前の統計情報の状態を統計情報履歴テーブルに保存することを指します。統計情報履歴テーブルでは、特定のテーブルの統計情報の履歴変更状況を照会できるだけでなく、指定した履歴バージョンの統計情報を復元することもできます。
統計情報履歴テーブルとビュー
OceanBaseデータベースのオプティマイザーは、以下のビューを使用して統計情報の履歴記録を保存します:
機能の適用範囲
現在のOceanBaseデータベースCommunity Editionは、DBA_TAB_STATS_HISTORY、DBA_TAB_COL_STATISTICS、およびDBA_TAB_HISTOGRAMSビューのみをサポートしています。
ALL_TAB_STATS_HISTORY、DBA_TAB_STATS_HISTORY、およびUSER_TAB_STATS_HISTORYは、テーブルレベルの履歴統計情報を保存するために使用されます。ALL_TAB_COL_STATISTICS、DBA_TAB_COL_STATISTICS、およびUSER_TAB_COL_STATISTICSは、列レベルの基本履歴統計情報を保存するために使用されます。ALL_TAB_HISTOGRAMS、DBA_TAB_HISTOGRAMS、およびUSER_TAB_HISTOGRAMSは、列レベルのヒストグラム履歴統計情報を保存するために使用されます。
テーブルのフィールドは基本的に統計情報を保存する内部テーブルのフィールドと一致しますが、統計情報の状態変更時刻を記録するsavtime列が追加されています。また、以下のビューを使用して統計情報の履歴変更状況を照会できます。
ビュー名 |
説明 |
|---|---|
| ALL_TAB_STATS_HISTORY DBA_TAB_STATS_HISTORY USER_TAB_STATS_HISTORY | 統計情報の履歴変更を照会するために使用されます。 |
| sys.ALL_VIRTUAL_TABLE_STAT_V2_HISTORY_REAL_AGENT | テーブルレベルの統計情報履歴のヴァーチャルテーブルを照会するために使用されます。 |
| sys.ALL_VIRTUAL_COLUMN_STAT_V2_HISTORY_REAL_AGENT | 列レベルの基本統計情報履歴のヴァーチャルテーブルを照会するために使用されます。 |
| sys.ALL_VIRTUAL_HISTOGRAM_STAT_V2_HISTORY_REAL_AGENT | 列レベルのヒストグラム情報履歴のヴァーチャルテーブルを照会するために使用されます。 |
統計情報履歴管理関連関数
現在、以下の履歴管理関連関数がサポートされています:
restore_table_stats指定した時点のテーブルレベルの履歴統計情報を復元します。restore_schema_stats指定した時点のSchemaレベルの履歴統計情報を復元します。purge_stats指定した時点以前の履歴統計情報を削除します。alter_stats_history_retention履歴統計情報の保持間隔時間を変更します。デフォルトの保持間隔時間は31日です。get_stats_history_retention現在の履歴統計情報の保持間隔時間を取得します。get_stats_history_availability現在利用可能な最も古い履歴統計情報の時刻を取得します。この時刻よりも早い指定時刻の履歴統計情報は復元できません。
具体的な定義は以下のとおりです:
PROCEDURE restore_table_stats (
ownname VARCHAR2,
tabname VARCHAR2,
as_of_timestamp TIMESTAMP WITH TIME ZONE,
restore_cluster_index BOOLEAN DEFAULT FALSE,
force BOOLEAN DEFAULT FALSE,
no_invalidate BOOLEAN DEFAULT FALSE
);
PROCEDURE restore_schema_stats (
ownname VARCHAR2,
as_of_timestamp TIMESTAMP WITH TIME ZONE,
force BOOLEAN DEFAULT FALSE,
no_invalidate BOOLEAN DEFAULT FALSE
);
PROCEDURE purge_stats(
before_timestamp TIMESTAMP WITH TIME ZONE
);
PROCEDURE alter_stats_history_retention(
retention NUMBER
);
FUNCTION get_stats_history_retention RETURN NUMBER;
FUNCTION get_stats_history_availability RETURN TIMESTAMP WITH TIME ZONE;
パラメータの説明は以下の表のとおりです。
パラメータ |
説明 |
|---|---|
| ownname |
|
| tabname | テーブル名。 |
| as_of_timestamp | 復元時刻を指定します。 |
| restore_cluster_index | このパラメータは現在実装されておらず、使用できません。 |
| force | 強制的に復元し、ロックを無視します。デフォルトはFalseです。 |
| no_invalidate | このパラメータは現在実装されておらず、使用できません。 |
統計情報履歴のクリーンアップポリシー
現在、OceanBaseデータベースは統計情報履歴のクリーンアップを自動クリーンアップと手動クリーンアップの2つの方法でサポートしています。
統計情報履歴の自動クリーンアップ
OceanBaseは分散データベースであるため、Server上で新規作成されたテナントに対して直接クリーンアップタスクを設定することはできません。そのため、テナント作成後、または低バージョンのServerを新バージョンにアップグレードした後、DBMS_SCHEDULER.CREATE_JOBを使用して手動でスケジュールタスクを作成し、自動クリーンアップ機能を有効にする必要があります。
##今から1日ごとに統計情報履歴の自動クリーンアップを実行するタスクを設定する
DECLARE
BEGIN
DBMS_SCHEDULER.CREATE_JOB(job_name => 'PRUGE_STATS',
job_type => 'PL/SQL Block',
job_action => 'call dbms_stats.purge_stats(NULL);',
repeat_interval => 'FREQ=DAILY;INTERVAL=1',
enabled => TRUE);
END;
/
デフォルトのクリーンアップタスク間隔は31日です。つまり、あるテーブルが31日間更新されなかった場合(その期間中、そのテーブルの統計情報が再収集または更新されなかった場合)、31日目にそのテーブルの履歴統計情報がクリーンアップされます。dbms_stats.alter_stats_history_retention() を使用して設定でき、有効範囲は [0,365000] です。0に設定すると、すべての履歴統計情報が削除され、今後記録されなくなります。
統計情報履歴の手動クリーンアップ
手動クリーンアップとは、dbms_stats.purge_stats() コマンドを明示的に呼び出してクリーンアップを実行することを指します。この方法は、特定の時点で迅速にクリーンアップが必要なシナリオに適しています。
例
現在の履歴統計情報の保持間隔時間を取得します。
SELECT dbms_stats.get_stats_history_retention() FROM DUAL;現在利用可能な最も古い履歴統計情報の時刻を取得します。
SELECT dbms_stats.get_stats_history_availability() FROM DUAL;履歴統計情報の保持間隔を15日に変更します。
CALL dbms_stats.alter_stats_history_retention(15);指定した復元ユーザー名
testの下のtbl1テーブルの特定時点での統計情報を取得します。CALL dbms_stats.restore_schema_stats('test', 'tbl1', to_timestamp('2021-09-26 19:02:12.675729', 'YYYY-MM-DD HH24:MI:SS.FF'));手動で指定時刻の履歴統計情報をクリーンアップします。
CALL dbms_stats.purge_stats(to_timestamp('2021-09-26 19:02:12.675729', 'YYYY-MM-DD HH24:MI:SS.FF'));