手動で統計情報を収集するほかに、現在OceanBaseデータベースのオプティマイザーはMAINTENANCE_WINDOWを使用して毎日自動的に統計情報を収集し、統計情報が反復的に更新されるように保証しています。ネイティブOracleと同様に、OceanBaseデータベースのオプティマイザーは月曜日から日曜日までの7つの自動統計情報収集タスクを定義しており、月曜日から日曜日までのタスクのデフォルト開始時間は22:00、最大収集時間は4時間です。以下の表を参照してください。
| メンテナンスウィンドウ名 | 開始時間/頻度 | 最大収集時間 |
|---|---|---|
| MONDAY_WINDOW | 22:00/週間 | 4時間 |
| TUESDAY_WINDOW | 22:00/週間 | 4時間 |
| WEDNESDAY_WINDOW | 22:00/週間 | 4時間 |
| THURSDAY_WINDOW | 22:00/週間 | 4時間 |
| FRIDAY_WINDOW | 22:00/週間 | 4時間 |
| SATURDAY_WINDOW | 22:00/週間 | 4時間 |
| SUNDAY_WINDOW | 22:00/週間 | 4時間 |
説明
- OceanBaseデータベースV4.3.5バージョンでは、V4.3.5 BP1バージョンからメンテナンスウィンドウ
SATURDAY_WINDOWおよびSUNDAY_WINDOWのタスクのデフォルト開始時間と最大収集時間が、デフォルト開始時間6:00、最大収集時間20時間からデフォルト開始時間22:00、最大収集時間4時間に変更されました。 - OceanBaseデータベースV4.2.5バージョンでは、V4.2.5 BP2バージョンからメンテナンスウィンドウ
SATURDAY_WINDOWおよびSUNDAY_WINDOWのタスクのデフォルト開始時間と最大収集時間が、デフォルト開始時間6:00、最大収集時間20時間からデフォルト開始時間22:00、最大収集時間4時間に変更されました。
自動統計情報収集の実行状況の確認
現在、OceanBaseデータベースのオプティマイザーは、自動統計情報収集の実行状況を確認するために以下のテーブルのビューを提供しています。
| モード | ビュー名 | 説明 |
|---|---|---|
| Oracle | DBA_SCHEDULER_JOBS |
ジョブ情報のクエリ |
| Oracle | ALL_SCHEDULER_WINDOWS、DBA_SCHEDULER_WINDOWS |
メンテナンスウィンドウ実行情報のクエリ |
| MySQL | OCEANBASE.DBA_SCHEDULER_JOBS |
ジョブ情報のクエリ |
| MySQL | OCEANBASE.DBA_SCHEDULER_WINDOWS |
メンテナンスウィンドウ実行情報のクエリ |
DBA_SCHEDULER_JOBSビューでは、主に以下のフィールドを確認します:
JOB_NAME:メンテナンスウィンドウタスクの名前。LAST_START_DATE:前回のメンテナンスウィンドウタスクの実行日時。NEXT_RUN_DATE:次回のメンテナンスウィンドウタスクの実行日時。ENABLED:現在のメンテナンスウィンドウタスクが有効かどうか。FAILURE_COUNT:メンテナンスウィンドウタスクの失敗回数。0以外の場合は、OceanBaseテクニカルサポートに連絡して調査する必要があります。MAX_RUN_DURATION:メンテナンスウィンドウタスクの最大持続時間。デフォルトは秒単位です。
自動統計情報収集のプロパティを変更する
ユーザーが自身の業務特性に応じて、自動統計情報収集の開始時間や収集期間などのプロパティを変更する必要があることを考慮し、OceanBaseデータベースオプティマイザーは以下の方法で自動統計情報収集のプロパティを変更できるようにしています:
自動統計情報タスクの収集を無効にします。
OceanBaseデータベースでは、システムパッケージDBMS_SCHEDULER.DISABLEを使用して、自動統計情報タスクの収集を無効にできます。
例:
MySQLモードOracleモード月曜日の自動統計情報収集を禁止します。
CALL DBMS_SCHEDULER.DISABLE('MONDAY_WINDOW');火曜日の自動統計情報収集を禁止します。
CALL DBMS_SCHEDULER.DISABLE('TUESDAY_WINDOW');水曜日の自動統計情報収集を禁止します。
CALL DBMS_SCHEDULER.DISABLE('WEDNESDAY_WINDOW');木曜日の自動統計情報収集を禁止します。
CALL DBMS_SCHEDULER.DISABLE('THURSDAY_WINDOW');金曜日の自動統計情報収集を禁止します。
CALL DBMS_SCHEDULER.DISABLE('FRIDAY_WINDOW');土曜日の自動統計情報収集を禁止します。
CALL DBMS_SCHEDULER.DISABLE('SATURDAY_WINDOW');日曜日の自動統計情報収集を禁止します。
CALL DBMS_SCHEDULER.DISABLE('SUNDAY_WINDOW');
注意
Oracleモードのユーザーテナントで以下のステートメントを実行する場合は、対応するsysユーザーを使用して実行する必要があります。
月曜日の自動統計情報収集を禁止します。
CALL DBMS_SCHEDULER.DISABLE('MONDAY_WINDOW');火曜日の自動統計情報収集を禁止します。
CALL DBMS_SCHEDULER.DISABLE('TUESDAY_WINDOW');水曜日の自動統計情報収集を禁止します。
CALL DBMS_SCHEDULER.DISABLE('WEDNESDAY_WINDOW');木曜日の自動統計情報収集を禁止します。
CALL DBMS_SCHEDULER.DISABLE('THURSDAY_WINDOW');金曜日の自動統計情報収集を禁止します。
CALL DBMS_SCHEDULER.DISABLE('FRIDAY_WINDOW');土曜日の自動統計情報収集を禁止します。
CALL DBMS_SCHEDULER.DISABLE('SATURDAY_WINDOW');日曜日の自動統計情報収集を禁止します。
CALL DBMS_SCHEDULER.DISABLE('SUNDAY_WINDOW');
自動統計情報タスクの収集を有効にします。
OceanBaseデータベースでは、システムパッケージDBMS_SCHEDULER.ENABLEを使用して、自動統計情報タスクの収集を有効にできます。
例:
MySQLモードOracleモード月曜日の統計情報の自動収集を有効にします。
CALL DBMS_SCHEDULER.ENABLE('MONDAY_WINDOW');火曜日の統計情報の自動収集を有効にします。
CALL DBMS_SCHEDULER.ENABLE('TUESDAY_WINDOW');水曜日の統計情報の自動収集を有効にします。
CALL DBMS_SCHEDULER.ENABLE('WEDNESDAY_WINDOW');木曜日の統計情報の自動収集を有効にします。
CALL DBMS_SCHEDULER.ENABLE('THURSDAY_WINDOW');金曜日の統計情報の自動収集を有効にします。
CALL DBMS_SCHEDULER.ENABLE('FRIDAY_WINDOW');土曜日の統計情報の自動収集を有効にします。
CALL DBMS_SCHEDULER.ENABLE('SATURDAY_WINDOW');日曜日の統計情報の自動収集を有効にします。
CALL DBMS_SCHEDULER.ENABLE('SUNDAY_WINDOW');
注意
Oracleモードのユーザーテナントで以下のステートメントを実行する場合は、対応するsysユーザーを使用して実行する必要があります。
月曜日の統計情報の自動収集を有効にします。
CALL DBMS_SCHEDULER.ENABLE('MONDAY_WINDOW');火曜日の統計情報の自動収集を有効にします。
CALL DBMS_SCHEDULER.ENABLE('TUESDAY_WINDOW');水曜日の統計情報の自動収集を有効にします。
CALL DBMS_SCHEDULER.ENABLE('WEDNESDAY_WINDOW');木曜日の統計情報の自動収集を有効にします。
CALL DBMS_SCHEDULER.ENABLE('THURSDAY_WINDOW');金曜日の統計情報の自動収集を有効にします。
CALL DBMS_SCHEDULER.ENABLE('FRIDAY_WINDOW');土曜日の統計情報の自動収集を有効にします。
CALL DBMS_SCHEDULER.ENABLE('SATURDAY_WINDOW');日曜日の統計情報の自動収集を有効にします。
CALL DBMS_SCHEDULER.ENABLE('SUNDAY_WINDOW');
自動統計情報収集のスケジュール時間を調整します。
OceanBaseデータベースの自動収集タスクは
DBMS_SCHEDULERに基づいて実装されているため、 DBMS_SCHEDULER.SET_ATTRIBUTE使用して自動統計情報のスケジュール時間を調整できます。注意
ウィンドウの次回実行時間は、実際の曜日に基づいて設定する必要があります。
例:
MySQLモードOracleモード現在が2024年3月7日、木曜日の午前11時である場合、金曜日の午前2時から統計情報を自動収集するように調整する必要があります。
CALL DBMS_SCHEDULER.SET_ATTRIBUTE('MONDAY_WINDOW', 'NEXT_DATE', '2024-03-11 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('TUESDAY_WINDOW', 'NEXT_DATE', '2024-03-12 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('WEDNESDAY_WINDOW', 'NEXT_DATE', '2024-03-13 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('THURSDAY_WINDOW', 'NEXT_DATE', '2024-03-14 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('FRIDAY_WINDOW', 'NEXT_DATE', '2024-03-08 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('SATURDAY_WINDOW', 'NEXT_DATE', '2024-03-09 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('SUNDAY_WINDOW', 'NEXT_DATE', '2024-03-10 02:00:00');注意
Oracleモードのユーザーテナントで以下のステートメントを実行する場合は、対応するsysユーザーを使用して実行する必要があります。
日付形式を設定します。
SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';タイムスタンプ形式を設定します。
SET NLS_TIMESTAMP_FORMAT='YYYY-MM-DD HH24:MI:SS.FF';タイムゾーン付きのタイムスタンプ形式を設定します。
SET NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH24:MI:SS.FF TZR TZD';現在が2024年3月7日木曜日の午前11時である場合、金曜日の午前2時から統計情報の自動収集を開始するように調整する必要があります。
CALL DBMS_SCHEDULER.SET_ATTRIBUTE('MONDAY_WINDOW', 'NEXT_DATE', '2024-03-11 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('TUESDAY_WINDOW', 'NEXT_DATE', '2024-03-12 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('WEDNESDAY_WINDOW', 'NEXT_DATE', '2024-03-13 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('THURSDAY_WINDOW', 'NEXT_DATE', '2024-03-14 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('FRIDAY_WINDOW', 'NEXT_DATE', '2024-03-08 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('SATURDAY_WINDOW', 'NEXT_DATE', '2024-03-09 02:00:00'); CALL DBMS_SCHEDULER.SET_ATTRIBUTE('SUNDAY_WINDOW', 'NEXT_DATE', '2024-03-10 02:00:00');
自動統計情報収集の仕組み
上記では、自動統計情報収集に関連する MAINTENANCE WINDOW の内容について説明しましたが、自動統計情報収集のタスクが開始された後の作業メカニズムはどのようなものでしょうか。以下の図は、自動統計情報収集の仕組みを示しています。

上記の自動統計情報収集において、あるテーブルの統計情報が期限切れかどうかを判断する際、主に前回の統計情報収集時から今回の収集までの期間におけるそのテーブルの追加・削除・変更の割合を基準とします。デフォルト値は10%です。注意すべき点として、この変化率はパーティション単位であることです。例えば、パーティションテーブルの特定のパーティションにおいて追加・削除・変更の割合が10%を超えた場合でも、それらのパーティションの統計情報は再収集されます。もちろん、デフォルトの変化率は設定可能であり、業務上の実際の状況に応じて perfs を設定することで調整できます。具体的な方法については、統計情報収集ポリシーの設定 を参照してください。さらに、OceanBaseデータベースのオプティマイザーは、あるテーブルの追加・削除・変更回数を照会するための関連ビューも提供しています。以下の表を参照してください。
| モード | ビュー名 | 説明 |
|---|---|---|
| Oracle | ALL_TAB_MODIFICATIONS |
テーブルのすべてのDML統計を照会する |
| Oracle | DBA_TAB_MODIFICATIONS |
テーブルのすべてのDML統計を照会する |
| Oracle | USER_TAB_MODIFICATIONS |
テーブルのすべてのDML統計を照会する |
| MySQL | OCEANBASE.DBA_TAB_MODIFICATIONS |
テーブルのすべてのDML統計を照会する |