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; /