現在、OceanBaseデータベースのオプティマイザーは、統計情報の履歴バージョン管理機能を提供しており、主に過去の統計情報の照会や統計情報のロールバックなどに使用されます。統計情報の状態が変更された場合(統計情報の収集、設定、削除、インポート、ロックなど)、変更前の統計情報は統計情報履歴テーブルに保存されます。統計情報履歴テーブルでは、特定のテーブルの統計情報の履歴変更状況を照会できるだけでなく、履歴バージョンの統計情報に復元することもできます。
過去の統計情報バージョンの照会について、現在のOceanBaseデータベースオプティマイザーは、以下のビューを提供しています。
モード |
ビュー名 |
説明 |
|---|---|---|
| Oracle | ALL_TAB_STATS_HISTORY |
統計情報の履歴変更を照会するために使用されます。 |
| Oracle | DBA_TAB_STATS_HISTORY |
統計情報の履歴変更を照会するために使用されます。 |
| Oracle | USER_TAB_STATS_HISTORY |
統計情報の履歴変更を照会するために使用されます。 |
| MySQL | OCEANBASE.DBA_TAB_STATS_HISTORY |
統計情報の履歴変更を照会するために使用されます。 |
ビュー内の STATS_UPDATE_TIME フィールドは、バージョン統計情報の更新時間を示します。指定したバージョンの統計情報にロールバックする必要がある場合、まず関連する履歴バージョン統計情報ビューを照会して必要な時間バージョン番号を取得し、次に以下の DBMS_STATS システムパッケージが提供するプロシージャを呼び出します。
restore_table_stats:特定のテーブルの指定バージョンの履歴統計情報を復元します。restore_schema_stats:特定のスキーマの指定バージョンの履歴統計情報を復元します。
同時に、履歴統計情報にはデフォルトの保存期間が設定されており、システムのデフォルト値は31日です。履歴統計情報の保存期間は、以下の DBMS_STATS システムパッケージが提供するプロシージャを使用して照会および変更できます。
alter_stats_history_retention:履歴統計情報の保持間隔時間を変更します。有効値範囲は [-1, 365000] です。設定値を -1 に設定すると、統計情報は決してクリアされません。0 に設定すると、履歴統計情報機能が無効になります。get_stats_history_retention:現在の履歴統計情報の保持間隔時間を取得します。
履歴統計情報のクリーンアップには主に2つの方法があります。1つは、保存期限を超えたものを自動的にクリーンアップする毎日の定期タスクです。もう1つは、DBMS_STATS.PURGE_STATS('$time_stamp') コマンドを明示的に呼び出して手動でクリーンアップを実行する方法です。
# 現在の履歴統計情報の保持間隔時間を取得する
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の下のT1テーブルの特定の時刻の統計情報を復元する
call dbms_stats.restore_table_stats('TEST', 'T1', 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'));