ablog

不器用で落着きのない技術者のメモ

10g 以降で統計情報収集を自前でやりたい場合

10g からデフォルトで自動的に統計情報を収集してくれる。
これを止めて夜間バッチなどで統計情報を収集したい場合、SYS.GATHER_STATS_JOB のスケジュール設定を無効化し、DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC プロシージャを実行してやれば良い。

統計情報収集ジョブのスケジュール設定を無効化する

EXECUTE SYS.DBMS_SCHEDULER.DISABLE( 'SYS.GATHER_STATS_JOB' );

スケジュール設定が無効化(ENABLED-->FALSE)されたことを確認する

COL OWNER FOR A10
COL JOB_NAME FOR A20
COL ENABLED FOR A6 
COL SCHEDULE_NAME FOR A30
SELECT OWNER, JOB_NAME, ENABLED, SCHEDULE_NAME FROM DBA_SCHEDULER_JOBS 
	WHERE JOB_NAME = 'GATHER_STATS_JOB';

任意の時間に統計情報を収集する

BEGIN
	DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC;
END;
/


追記(2010/04/05):
スキーマ単位で統計情報を収集する方法。

SQL> EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS (
	OWNNAME		=> 'SCOTT',
	OPTIONS		=> 'GATHER',
	DEGREE		=> 'DEFAULT_DEGREE',
	GRANULARITY	=> 'ALL',
	CASCADE		=> 'TRUE'
);

参考


追記(2010/11/17):
11gR1以降は自動オプティマイザ統計収集を無効化する方法が変わってるんですね。

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