Oracle10g 统计信息自动收集
1.自动收集统计信息的任务,默认是开启的。
SQL> select OWNER,job_name,STATE from dba_scheduler_jobs where job_name ='GATHER_STATS_JOB';
OWNER JOB_NAME STATE
-------- ------------------------------ ---------------
SYS GATHER_STATS_JOB SCHEDULED
PA是disable掉的。
SQL> select OWNER,job_name,STATE from dba_scheduler_jobs where job_name ='GATHER_STATS_JOB';
OWNER JOB_NAME STATE
-------------------- ------------------------------ ---------------
SYS GATHER_STATS_JOB DISABLED
让我们来查看这个调度任务更详细的信息
select owner,job_name,job_type,job_action,program_name,schedule_name,start_date,repeat_interval,enabled from dba_scheduler_jobs where job_name ='GATHER_STATS_JOB';
我们发现:
program_name是GATHER_STATS_PROG
schedule_name是DBA_MAINTENANCE_WINDOW_GROUP
sys.GATHER_STATS_JOB会调用sys.GATHER_STATS_PROG这个PROGRAM来执行统计信息收集。
我们看一看这个program定义了什么程序。
select owner,program_name,program_type,program_action,enabled,comments from DBA_SCHEDULER_PROGRAMS where program_name='GATHER_STATS_PROG';
我们发现,这个program指示了一个存储过程.dbms_stats.gather_database_stats_job_proc;。
它就是用来收集数据库的统计信息的,Oracle加密了它的代码。
接下来,我们来看看它运行的时间,即schedule_name是DBA_MAINTENANCE_WINDOW_GROUP
select * from dba_scheduler_windows;
select * from dba_scheduler_window_groups;
select * from DBA_SCHEDULER_WINGROUP_MEMBERS;
我们发现,这个wingroup对应的window是week_night_window,周一至五,晚上10点开始持续8小时打开窗口。
这个收集只针对以下两种情况的对象:
1.缺少统计信息的对象。
2.统计数据无效的对象:自上一次收集以后有10%或以上的DML修改,Oracle就认为这个对象的统计信息失效。
默认时,只要将STATISTICS_LEVEL设置为TYPICAL(默认)或ALL,Oracle就会监控对象的DML改变。它会根据每个对象DML活动的范围来设置对象的优先级。这个过程首先会对DML变化最大的对象进行分析。这样,即使在维护窗口关闭之前没有完成整个统计信息收集工作,也可以保证收集了必须的统计信息。因为默认情况下,维护窗口关闭的时候,会终止仍在进行的GATHER_STATS_JOB调度,没有进行收集的下一次会自动优先处理。如果将GATHER_STATS_JOB调度的STOP_ON_WINDOW_CLOSE属性设置为FALSE,那么维护窗口到了也会继续进行收集。
关闭及开启自动搜集功能,有两种方法,分别如下:
方法一:
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;