統計情報の履歴管理機能とは、主に統計情報の状態が変更された場合(統計情報の再収集、設定、削除、インポート、ロックなど)に、変更前の統計情報の状態を統計情報履歴テーブルに保存することを指します。統計情報履歴テーブルでは、特定のテーブルの過去の統計情報の変更状況を照会できるほか、指定した履歴バージョンの統計情報を復元することも可能です。
統計情報履歴テーブルおよびビュー
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 列が追加されている点が異なります。また、以下のビューを使用して統計情報の履歴変更状況を照会できます。
| ビュー名 | 説明 | |
|---|---|---|
| MySQLモード | oceanbase.DBA_TAB_STATS_HISTORY | 統計情報の履歴変更を照会するために使用されます。 |
| Oracleモード |
|
統計情報の履歴変更を照会するために使用されます。 |
ステートメント定義
OceanBaseのOracleおよびMySQLモードはどちらもサポートしており、使用方法は基本的に同一です。特に断りがない限り、デフォルトでは使用方法が同じであることを意味します。
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'));
関連ドキュメント
MySQLモードにおける履歴統計情報の管理に関するストアドプロシージャのドキュメント:
- RESTORE_TABLE_STATS(MySQLモード)
- RESTORE_SCHEMA_STATS(MySQLモード)
- PURGE_STATS(MySQLモード)
- ALTER_STATS_HISTORY_RETENTION(MySQLモード)
- GET_STATS_HISTORY_RETENTION(MySQLモード)
- GET_STATS_HISTORY_AVAILABILITY(MySQLモード)
Oracleモードにおける履歴統計情報の管理に関するストアドプロシージャのドキュメント: