OceanBaseデータベースのオプティマイザーは、以下のために統計情報履歴バージョン管理機能を提供します:
- 統計情報の履歴バージョンの照会
- 統計情報を指定されたバージョンにロールバックする
- 履歴情報の保持期間の管理
統計情報が変更される(収集、設定、削除、インポート、ロックなど)と、システムは自動的に変更前の統計情報を統計情報履歴テーブルに保存します。統計情報履歴テーブルでは、特定のテーブルの履歴統計情報の変更状況を照会できるだけでなく、指定された履歴バージョンの統計情報を復元することも可能です。
歴史統計情報の照会
サポートされるクエリビュー
モードタイプに応じて、以下のビューを使用して過去のバージョンの統計情報を照会できます。
| モード | ビュー名 | 機能の説明 |
|---|---|---|
| Oracle | ALL_TAB_STATS_HISTORY |
現在のユーザーがアクセス可能なすべてのテーブルの統計変更履歴を提供します。 |
| Oracle | DBA_TAB_STATS_HISTORY |
データベース内のすべてのテーブルの統計変更履歴を表示します。 |
| Oracle | USER_TAB_STATS_HISTORY |
現在のユーザーが所有するすべてのテーブルの統計変更履歴を表示します。 |
| MySQL | OCEANBASE.DBA_TAB_STATS_HISTORY |
MySQLモードと互換性のある統計情報の履歴クエリで、データベース内のすべてのテーブルの統計履歴を表示します。 |
主なフィールドの説明:
STATS_UPDATE_TIME:統計情報バージョンの更新タイムスタンプ。
例:利用可能な最も古い履歴バージョンの時間を取得する
-- 現在使用可能な最も古い履歴統計情報の時間を照会する
SELECT DBMS_STATS.GET_STATS_HISTORY_AVAILABILITY() FROM DUAL;
指定された統計バージョンへのロールバック
操作手順
- ターゲットタイムスタンプの照会:ビューまたは
GET_STATS_HISTORY_AVAILABILITYを使用して、履歴バージョンの時間を取得します。 - システムパッケージのストアドプロシージャを使用する:
DBMS_STATSパッケージ内のストアドプロシージャを使用して、タイムスタンプを指定して統計情報を復元します。
サポートされるストアドプロシージャ
| ストアドプロシージャ | 機能 |
|---|---|
RESTORE_TABLE_STATS |
特定のテーブルの指定されたバージョンの履歴統計情報を復元します。 |
RESTORE_SCHEMA_STATS |
特定のスキーマの指定されたバージョンの履歴統計情報を復元します。 |
例:TESTユーザーのT1テーブルの統計情報を復元する
-- TESTユーザーのT1テーブルの統計情報を2021-09-26 19:02:12に復元することを指定する
CALL DBMS_STATS.RESTORE_TABLE_STATS(
ownname => 'TEST',
tabname => 'T1',
time => TO_TIMESTAMP('2021-09-26 19:02:12.675729', 'YYYY-MM-DD HH24:MI:SS.FF')
);
履歴情報保持期間の管理
デフォルト値
システムのデフォルトでは、履歴統計情報は 31日 保持されます。
履歴情報保持期間の設定
DBMS_STATS パッケージのストアドプロシージャを使用して保持期間を管理します。
| ストアドプロシージャ | 機能 |
|---|---|
ALTER_STATS_HISTORY_RETENTION |
歴史的な統計情報の保持間隔時間を変更します。有効な値の範囲は[-1, 365000]です。注意点として、設定値が-1の場合、統計情報は決してクリーンアップされません。また、0に設定すると、歴史的な統計情報機能が無効になります。 |
GET_STATS_HISTORY_RETENTION |
現在の歴史的な統計情報の保持間隔時間を取得します。 |
例:保持期間の変更と照会
-- 現在の保持日数を取得する
SELECT DBMS_STATS.GET_STATS_HISTORY_RETENTION() FROM DUAL;
-- 保持期間を15日に設定する
CALL DBMS_STATS.ALTER_STATS_HISTORY_RETENTION(15);
歴史統計情報のクリーンアップ
自動クリーンアップメカニズム
システムは毎日、保持期間を超えた 歴史統計情報を自動的にクリーンアップします。
手動クリーンアップメカニズム
PURGE_STATS ストアドプロシージャを使用して、指定されたタイムスタンプの履歴バージョンを削除できます。
例:指定された時間の履歴情報を手動でクリーンアップする
CALL DBMS_STATS.PURGE_STATS(
time => TO_TIMESTAMP('2021-09-26 19:02:12.675729', 'YYYY-MM-DD HH24:MI:SS.FF')
);