從10g開始,Oracle在建庫后就默認創建了一個名為GATHER_STATS_JOB的定時任務,用於自動收集CBO的統計信息。這個自動任務默認情況下在工作日晚上10:00-6:00和周末全天開啟。
1、查看自動收集統計信息的任務及狀態:
SQL> select job_name,schedule_name,enabled,last_start_date,last_run_duration,next_run_date 2 from dba_scheduler_jobs a 3 where job_name = 'GATHER_STATS_JOB'
2、啟用/禁止自動收集統計信息的任務
方法一: 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;
3、獲得當前自動收集統計信息的執行時間
SQL> col WINDOW_NAME format a20 SQL> col DURATION format a20 SQL> col REPEAT_INTERVAL format a75 SQL> select t2.window_group_name,t1.window_name,t1.repeat_interval,t1.duration 2 from dba_scheduler_windows t1,dba_scheduler_wingroup_members t2 3 where t1.window_name=t2.window_name; WINDOW_GROUP_NAME WINDOW_NAME REPEAT_INTERVAL DURATION ------------------------------ -------------------- --------------------------------------------------------------------------- -------------------- MAINTENANCE_WINDOW_GROUP WEEKNIGHT_WINDOW freq=daily;byday=MON,TUE,WED,THU,FRI;byhour=22;byminute=0; bysecond=0 +000 08:00:00 MAINTENANCE_WINDOW_GROUP WEEKEND_WINDOW freq=daily;byday=SAT;byhour=0;byminute=0;bysecond=0 +002 00:00:00 SQL>
4、修改統計信息執行的時間
--修改WEEKEND_WINDOW的配置 (改成和WEEKNIGHT_WINDOW相同,即周一~周五,每日的22:00向后8小時,至次日凌晨6點) begin dbms_scheduler.set_attribute('WEEKEND_WINDOW','REPEAT_INTERVAL','freq=daily;byday=SAT,SUN;byhour=22;byminute=0;bysecond=0'); dbms_scheduler.set_attribute('WEEKEND_WINDOW','DURATION','+000 08:00:00'); end; / --若要還原成以前默認設置,可執行如下 --周末兩天都是全天: begin dbms_scheduler.set_attribute('WEEKEND_WINDOW','REPEAT_INTERVAL','freq=daily;byday=SAT;byhour=0;byminute=0;bysecond=0'); dbms_scheduler.set_attribute('WEEKEND_WINDOW','DURATION','+002 00:00:00'); end; /
5、查看統計信息執行的歷史記錄
--JOB運行歷史記錄 select * from dba_scheduler_job_log where job_name = 'GATHER_STATS_JOB' --正在運行的job select * from dba_scheduler_running_jobs