【Oracle】自動統計収集のスケジュールと制御方法|夜間バッチの影響を避ける

【Oracle】自動統計収集のスケジュールと制御方法|夜間バッチの影響を避ける Oracle

Oracleデータベースでは、自動統計収集(Automatic Statistics Gathering)がデフォルトで有効になっており、オプティマイザが正確な実行計画を立てるために重要な役割を担っています。

しかし、統計情報の収集が大量データをスキャンすることもあるため、夜間バッチ処理やリソース集中時間帯と重なると、パフォーマンスに影響を及ぼすことがあります。この記事では、自動統計収集の仕組みと、スケジュールの確認・変更・停止方法を解説します。

自動統計収集の概要

Oracleでは、メンテナンス・ウィンドウの時間帯に「自動タスク」として統計情報の収集が実行されます。対象は統計が古い(STALE)または未収集のテーブルです。

このタスクは、DBMS_AUTO_TASK_ADMINパッケージによって管理されており、Oracle 11g以降はDBMS_SCHEDULERを使ってスケジューリングされています。

現在の統計収集タスクのステータス確認

統計収集のタスクが有効かどうかは、以下のSQLで確認できます。

SELECT client_name, status
FROM dba_autotask_client;

Statistics GatheringENABLEDであれば、自動で統計情報が収集されています。

スケジュールの確認と変更

統計収集は、メンテナンスウィンドウにスケジューリングされています。現在のスケジュールは以下のSQLで確認できます。

SELECT window_name, start_time, duration, enabled
FROM dba_scheduler_windows
WHERE window_name LIKE '%MAINTENANCE%';

たとえば、「MONDAY_WINDOW」や「WEEKEND_WINDOW」などが存在し、通常は深夜0時から始まり、4時間などの期間で設定されています。

スケジュールを変更したい場合は、以下のようにDBMS_SCHEDULERを使います:

BEGIN
  DBMS_SCHEDULER.set_attribute(
    name      => 'MONDAY_WINDOW',
    attribute => 'REPEAT_INTERVAL',
    value     => 'freq=daily;byday=MON;byhour=3;byminute=0;bysecond=0');
END;
/

この例では、月曜日の午前3時に変更しています。

自動統計収集を一時的または恒久的に停止する

バッチ処理の競合を避けるため、一時的に統計収集を止めたいという場面もあります。

統計収集タスクの無効化:

BEGIN
  DBMS_AUTO_TASK_ADMIN.disable(
    client_name => 'auto optimizer stats collection',
    operation   => NULL,
    window_name => NULL);
END;
/

再有効化する場合:

BEGIN
  DBMS_AUTO_TASK_ADMIN.enable(
    client_name => 'auto optimizer stats collection',
    operation   => NULL,
    window_name => NULL);
END;
/

統計情報を手動で収集する

自動収集を停止した場合は、必要に応じてDBMS_STATSパッケージで手動実行します:

EXEC DBMS_STATS.gather_schema_stats('SCOTT');

特定テーブルのみ対象にすることも可能です:

EXEC DBMS_STATS.gather_table_stats('SCOTT', 'EMP');

同時にオプションを指定することで、サンプリング率や並列度も調整できます。

パフォーマンス影響を避けるための対策

  • 統計収集スケジュールをバッチ処理と被らない時間帯に変更
  • 大規模なデータ変更の後だけ手動収集する運用
  • PGA/CPUなどのリソースモニタリングと連携して調整
  • ウィンドウ単位でのメンテナンス時間調整

まとめ

Oracleの自動統計収集は非常に便利な機能ですが、夜間バッチ処理と競合するとパフォーマンス低下の要因となることがあります。運用環境に応じて、スケジュールの最適化や一時的な停止も検討しましょう。

自動タスクはDBA_SCHEDULERやDBMS_AUTO_TASK_ADMINで柔軟に制御できるため、本番環境に応じた設定を行うことで、安定したパフォーマンス維持に役立ちます。