一、查詢收集統計信息計划
select * from dba_scheduler_windows t1,dba_scheduler_wingroup_members t2 where t1.window_name=t2.window_name and t2.window_group_name in ('MAINTENANCE_WINDOW_GROUP','BSLN_MAINTAIN_STATS_SCHED');
或
select t1.window_name,t1.repeat_interval,t1.duration from dba_scheduler_windows t1,dba_scheduler_wingroup_members t2 where t1.window_name=t2.window_name and t2.window_group_name in ('MAINTENANCE_WINDOW_GROUP','BSLN_MAINTAIN_STATS_SCHED');
以下是默認是統計信息收集時間
二、修改集統計信息計划的開始時間
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name=>'"SYS"."TUESDAY_WINDOW"',
attribute=>'REPEAT_INTERVAL',
value=>'freq=daily;byday=TUE;byhour=9;byminute=0; bysecond=0');
END;
三、修改收集統計信息計划的持續時間
BEGIN
DBMS_SCHEDULER.SET_ATTRIBUTE(
name=>'"SYS"."TUESDAY_WINDOW"',
attribute=>'DURATION',
value=>numtodsinterval(1200, 'minute'));
END;
numtodsinterval中也可以用 小時hour為單位
關閉單個調度窗口
BEGIN DBMS_AUTO_TASK_ADMIN.disable(client_name => 'auto optimizer stats collection', operation => NULL, window_name => 'MONDAY_WINDOW'); END;
開啟單個調度窗口
BEGIN
DBMS_AUTO_TASK_ADMIN.enable(client_name => 'auto optimizer stats collection',
operation => NULL,
window_name => 'MONDAY_WINDOW');
END;
關閉所有時間調度窗口
BEGIN
DBMS_AUTO_TASK_ADMIN.disable (
client_name => 'auto optimizer stats collection',
operation => NULL,
window_name => NULL);
END;
/
然而我們在生產中會經常發現,自動收集統計信息會漏掉很多表,我們就需要用到手動收集統計信息、創建計划任務自動執行
四、查詢表的統計信息,手動收集統計信息
在Oracle中,存在執行計划不准的情況,懷疑表的統計信息是否收集,需要以下操作:
select table_name,num_rows,blocks,last_analyzed from user_tables where table_name='EMP';
說明:
-- table_name:展示表名 --num_rows:最后一次統計時的行數 --blocks:非當前塊數,最后一次統計時的塊數 --last_analyzed :最后一次統計的時間
--上述字段為null說明未統計
手動收集統計信息,並再次查看:
exec dbms_stats.gather_table_stats(ownname=>'META',tabname=>'EMP',estimate_percent=>10,method_opt=>'for all indexed columns');