在自動收集統計信息以前,有幾個問題須要考慮:sql
一、那些表適合使用計算模式收集統計信息?那些表適合使用估算模式收集統計信息?估算比率是多少?數據庫
二、那些列須要收集直方圖信息,bucket是多少?windows
三、在什麼時間收集統計信息,收集多長時間,如何讓收集統計信息的做業不會對業務形成影響。oracle
四、如何避免收集統計信息的時間太長,對象
五、如何高效的收集全庫統計信息,統計信息過時的判斷標準是什麼,或者說重複收集統計信息的策略是什麼?資源
如上這些問題其實很那回答,在oracle10g以後,使用自動統計信息收集做業可以自動判斷以上問題。自動收集統計信息的前提是statistics_level爲typical或者all。另外,oracle自動收集統計信息做業會自動收集數據字典統計信息,可是不會收集內部對象(X$)對象信息。get
在oracle 10g,自動收集統計信息做業爲'GATHER_STATS_JOB',查看庫預約義做業:io
select job_name,program_name,schedule_name from dba_scheduler_jobs where job_name='GATHER_STATS_JOB';監控
查看調用的窗口:cli
select * from dba_scheduler_wingroup_members where window_group_name='MAINTENACE_WINDOW_GROUP'
查看窗口調用時間:
select window_name,repeat_interval,duration from dba_scheduler_windows where windows_name in (select WINDOWS_NAME from dba_scheduler_wingroup_members where window_group_name=(select schedule_name from dba_scheduler_jobs where job_name='GATHER_STATS_JOB')) AND ENABLED='TRUE';
查看窗口執行歷史:
select actual_start_date,job_name,status from (select * from dba_scheduler_job_run_details where job_name='GATHER_STATS_JOB' ORDER BY LOG_DATE DESC ) WHERE ROWNUM<4;
在oracle 11g,自動收集統計信息做業爲'GATHER_STATS_PROG',查看庫預約義做業:
select client_name,task_name,operation_name,status from dba_autotask_task;
select program_action from dba_scheduler_programs where program_name='GATHER_STATS_PROG';
查看窗口:
select windows_name,autotask_sttus from dba_autotask_window_clients;
查看窗口調用時間:
select window_name,repeat_interval,duration from dba_scheduler_windows where enabled='TRUE';
查看窗口默認資源限制:
SELECT WINDOW_NAME,RESOURCE_PLAN FROM DBA_SCHEDULER_WINDOWS ;
歷史執行信息:
select client_name,windows_name,jon_name,jon_start_time from (select * from dba_autotask_job_history where clinet_name='auto optimizer stats collection' order by window_start_time desc ) where rownum<4;
Oracle 11g中的自動統計信息做業是經過GATHER_STATS_PROG來實現的,每次運行時會先生成ORA$AT_OS_OPT_XX的做業,而後在執行這個做業來自動收集統計信息。
數據庫經過獲取sys.mon_mods_all$信息監控每一個對象操做信息,包括inserts,updates,deletes和truncate操做。
SQL> select obj#,inserts,updates,deletes,flags from sys.mon_mods_all$ where obj#=87688;
OBJ# INSERTS UPDATES DELETES FLAGS
---------- ---------- ---------- ---------- ----------
87688 1 10000 499 0
其中FLAGS是標記是否執行truncate操做。
策略
一、當系統導入了大量數據以後,若是要立刻進行相關業務處理,建議在開始業務處理以前及時對相關表手工收集統計信息。由於這些被導入了大量數據的表已經來不及等到當天的自動統計信息收集做業自動收集統計信息了。
二、某些新上線或新遷移的系統,其中的某些表在上線/遷移以前初始數據量爲0(相關統計信息也爲0),接在導入商量數據後開始正式上線業務處理,建議在進行相關業務以前對這些表手工收集統計信息。
自定義統計信息自動收集任務:
一、禁止掉自動統計信息收集做業:
在10g中,exec dbms_scheduler.disable('GATHER_STATS_JOB');
而在11g中,exec dbms_auto_task_admin.disable(
client_name=>'auto optimier stats collection',
operation=>null,
window_name=>null);
二、禁止掉週一到週五的自動收集做業:
在10g中,週一至週五是weeknight_window,因此咱們直接禁止掉就能夠了。
begin
dbms_scheduler.disable(
name=>'"SYS"."WEEKNIGHT_WINDOW"',
force=>true);
end;
/
select windows_name,repeat_interval,duration,enabled from dba_scheduler_windows where window_name in ('WEEKNIGHT_WINDOW','WEEKEND_WINDOW');
三、在11g中,禁止掉週一自動收集做業,將週二的其實執行時間改成晚上11點,週三起始執行時間改成晚上9點,週三執行時間調整爲5個小時。
select window_name,repeat_interval,duration,enabled from dba_scheduler_windows;
WINDOW_NAME REPEAT_INTERVAL DURATION ENABLED
-------------------- ------------------------------ -------------------- ----------
MONDAY_WINDOW freq=daily;byday=MON;byhour=22 +000 04:00:00 TRUE
;byminute=0; bysecond=0
TUESDAY_WINDOW freq=daily;byday=TUE;byhour=22 +000 04:00:00 TRUE
;byminute=0; bysecond=0
WEDNESDAY_WINDOW freq=daily;byday=WED;byhour=22 +000 04:00:00 TRUE
;byminute=0; bysecond=0
THURSDAY_WINDOW freq=daily;byday=THU;byhour=22 +000 04:00:00 TRUE
;byminute=0; bysecond=0
WINDOW_NAME REPEAT_INTERVAL DURATION ENABLED
-------------------- ------------------------------ -------------------- ----------
FRIDAY_WINDOW freq=daily;byday=FRI;byhour=22 +000 04:00:00 TRUE
;byminute=0; bysecond=0
SATURDAY_WINDOW freq=daily;byday=SAT;byhour=6; +000 20:00:00 TRUE
byminute=0; bysecond=0
SUNDAY_WINDOW freq=daily;byday=SUN;byhour=6; +000 20:00:00 TRUE
byminute=0; bysecond=0
WEEKNIGHT_WINDOW freq=daily;byday=MON,TUE,WED,T +000 08:00:00 FALSE
WINDOW_NAME REPEAT_INTERVAL DURATION ENABLED
-------------------- ------------------------------ -------------------- ----------
HU,FRI;byhour=22;byminute=0; b
ysecond=0
WEEKEND_WINDOW freq=daily;byday=SAT;byhour=0; +002 00:00:00 FALSE
byminute=0;bysecond=0
禁止週一自動收集任務須要先disable掉在enabled掉,最後在修改
禁止掉週一自動收集任務:
begin
dbms_scheduler.disable(
name=>'"SYS"."MONDAY_WINDOW"',
force=>true);
end;
/
修改週二自動收集任務:
begin
dbms_scheduler.disable(
name=>'"SYS"."TUESDAY_WINDOW"',
force=>true);
end;
/
begin
dbms_scheduler.set_attribute(
name=>'"SYS"."TUESDAY_WINDOW"',
attribute=>'repeat_interval',
value=>'freq=daily;byday=TUE;byhour=23;byminute=0;bysecond=0');
end;
/
begin
dbms_scheduler.enable(
name=>'"SYS"."TUESDAY_WINDOW"');
end;
/
修改週三自動收集任務:
begin
dbms_scheduler.disable(
name=>'"SYS"."WEDNESDAY_WINDOW"',
force=>true);
end;
/
修改週三自動收集做業夜晚9點開始
begin
dbms_scheduler.set_attribute(
name=>'"SYS"."WEDNESDAY_WINDOW"',
attribute=>'repeat_interval',
value=>'freq=daily;byday=WED;byhour=21;byminute=0;bysecond=0');
end;
/
修改週三自動收集做業時長爲5小時
begin
dbms_scheduler.set_attribute(
name=>'"SYS"."WEDNESDAY_WINDOW"',
attribute=>'duration',
value=>numtodsinterval(300,'minute'));
end;
/
begin
dbms_scheduler.enable(
name=>'"SYS"."WEDNESDAY_WINDOW"');
end;
/
若是隻想禁止掉自動收集統計信息做業,而保留automatic segment adviser和automatic sql tuning adviser做業的話,則須要:
SQL> select window_name,optimizer_stats,segment_advisor,sql_tune_advisor from dba_autotask_window_clients;
WINDOW_NAME OPTIMIZER_STATS SEGMENT_ADVISOR SQL_TUNE_ADVISOR
-------------------- ---------------- ---------------- ----------------
TUESDAY_WINDOW ENABLED ENABLED ENABLED
WEDNESDAY_WINDOW ENABLED ENABLED ENABLED
THURSDAY_WINDOW ENABLED ENABLED ENABLED
FRIDAY_WINDOW ENABLED ENABLED ENABLED
SATURDAY_WINDOW ENABLED ENABLED ENABLED
SUNDAY_WINDOW ENABLED ENABLED ENABLED
begin
dbms_auto_task_admin.disable(
client_name=>'auto optimier stats collection',
operation=>null,
window_name=>'MONDAY_WINDOW ');
end;
/
查看
SQL> select window_name,optimizer_stats,segment_advisor,sql_tune_advisor from dba_autotask_window_clients;
WINDOW_NAME OPTIMIZER_STATS SEGMENT_ADVISOR SQL_TUNE_ADVISOR
-------------------- ---------------- ---------------- ----------------
MONDAY_WINDOW DISABLED ENABLED ENABLED
TUESDAY_WINDOW ENABLED ENABLED ENABLED
WEDNESDAY_WINDOW ENABLED ENABLED ENABLED
THURSDAY_WINDOW ENABLED ENABLED ENABLED
FRIDAY_WINDOW ENABLED ENABLED ENABLED
SATURDAY_WINDOW ENABLED ENABLED ENABLED
SUNDAY_WINDOW ENABLED ENABLED ENABLED
系統會默認採集直方圖信息,爲了保持系統穩定性咱們建議對已存在的直方圖信息才收集,其他的手動收集。
查看系統默直方圖收集範圍,修改成對已經存在的直方圖收集信息:
SQL> select dbms_stats.get_param('method_opt') from dual;
DBMS_STATS.GET_PARAM('METHOD_OPT')
--------------------------------------------------------------------------------
FOR ALL COLUMNS SIZE AUTO
修改爲對已存在的直方圖收集
SQL> exec dbms_stats.set_param('method_opt','for all columns size repeat');
PL/SQL procedure successfully completed.
SQL> select dbms_stats.get_param('method_opt') from dual;
DBMS_STATS.GET_PARAM('METHOD_OPT')
--------------------------------------------------------------------------------
FOR ALL COLUMNS SIZE REPEAT