一.11g中auto stats gather job被集成到了auto task中。
SQL> select client_name,status from DBA_AUTOTASK_CLIENT; CLIENT_NAME STATUS ---------------------------------------------------------------- -------- auto optimizer stats collection ENABLED auto space advisor ENABLED sql tuning advisor ENABLED SQl>select client_name,operation_name from dba_autotask_operation t; ------------------ --------------------------- CLIENT_NAME OPERATION_NAME auto optimizer stats collection auto optimizer stats job auto space advisor auto space advisor job sql tuning advisor automatic sql tuning task
可以通過以上視圖進行名字和狀態的查看。
禁用的時候,使用存儲過程逐個禁用。
SQL> begin 2 DBMS_AUTO_TASK_ADMIN.DISABLE(client_name => 'sql tuning advisor', 3 operation => NULL, 4 window_name => NULL); 5 end; 6 / PL/SQL procedure successfully completed. SQL> select client_name,status from DBA_AUTOTASK_CLIENT; CLIENT_NAME STATUS ---------------------------------------------------------------- -------- auto optimizer stats collection DISABLED auto space advisor ENABLED sql tuning advisor DISABLED
二.在10G版本中,自動收集的job名字為:GATHER_STATS_JOB,默認情況下該job每天晚上10點執行.
1.查看該job的狀態以及執行情況
Select a.Enabled, Last_Start_Date, Next_Run_Date From Dba_Scheduler_Jobs a Where Job_Name = 'GATHER_STATS_JOB';
2.關閉和啟動該job
方法一:
exec dbms_scheduler.disable('SYS.GATHER_STATS_JOB');
exec dbms_scheduler.enable('SYS.GATHER_STATS_JOB');
方法二:
alter system set "_optimizer_autostats_job"=false scope=spfile;
alter system set "_optimizer_autostats_job"=true scope=spfile;
三.其他建議
對於數據量很大的庫,一般是建議關閉掉自動收集的任務,通過自己手工寫存儲過程,再把存儲過程加入JOB中去收集統計信息,統計信息的收集是根據表的大小來自己定義收集的采樣率以及其他的選項。
可以參考如下的存儲過程:
DECLARE CURSOR STALE_TABLE IS SELECT OWNER, SEGMENT_NAME, CASE WHEN SIZE_GB < 0.5 THEN 30 WHEN SIZE_GB >= 0.5 AND SIZE_GB < 1 THEN 20 WHEN SIZE_GB >= 1 AND SIZE_GB < 5 THEN 10 WHEN SIZE_GB >= 5 AND SIZE_GB < 10 THEN 5 WHEN SIZE_GB >= 10 THEN 1 END AS PERCENT, 8 AS DEGREE FROM (SELECT OWNER, SEGMENT_NAME, SUM(BYTES / 1024 / 1024 / 1024) SIZE_GB FROM DBA_SEGMENTS WHERE OWNER = 'SCOTT' AND SEGMENT_NAME IN (SELECT /*+ UNNEST */ DISTINCT TABLE_NAME FROM DBA_TAB_STATISTICS WHERE (LAST_ANALYZED IS NULL OR STALE_STATS = 'YES') AND OWNER = 'SCOTT') GROUP BY OWNER, SEGMENT_NAME); BEGIN DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO; FOR STALE IN STALE_TABLE LOOP DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => STALE.OWNER, TABNAME => STALE.SEGMENT_NAME, ESTIMATE_PERCENT => STALE.PERCENT, METHOD_OPT => 'for all columns size skewonly', DEGREE => 8, GRANULARITY => 'ALL', CASCADE => TRUE); END LOOP; END;
上述的存儲過程,先定義了表的大小所對應的采樣率,然后通過查詢DBA_SEGMENTS得到表的大小,再通過DBMS_STATS.GATHER_TABLE_STATS去收集統計信息。