在自动收集统计信息以前,有几个问题须要考虑: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