統計情報の履歴管理機能とは、統計情報の状態が変更された場合(統計情報の再収集、設定、削除、インポート、ロックなど)、変更前の統計情報の状態を統計情報履歴テーブルに保存することを指します。統計情報履歴テーブルでは、特定のテーブルの過去の統計情報の変更履歴を照会できるほか、指定した履歴バージョンの統計情報を復元することも可能です。
統計情報履歴テーブルとビュー
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指定した時刻のスキーマレベルの履歴統計情報を復元します。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'));