10g收集统计信息

10g收集统计信息

---------------------------------------

从10g开始,Oracle在建库后就默认创建了一个名为GATHER_STATS_JOB的定时任务,用于自动收集CBO的统计信息

这个自动任务默认情况下在工作日晚上10:00-6:00和周末全天开启。

调用DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC收集统计信息。该过程首先检测统计信息缺失和陈旧的对象。然后确定优先级,再开始进行统计信息。


可以通过以下查询这个JOB的运行情况

SELECT * FROM Dba_Scheduler_Jobs WHERE Job_Name = 'GATHER_STATS_JOB';

其实同在10点运行的Job还有一个AUTO_SPACE_ADVISOR_JOB:

SELECT Job_Name, Last_Start_Date FROM Dba_Scheduler_Jobs;


JOB_NAME LAST_START_DATE

------------------------------ ------------------------------------

AUTO_SPACE_ADVISOR_JOB 30-OCT-08 10.00.01.463000 PM +08:00

GATHER_STATS_JOB 30-OCT-08 10.00.01.463000 PM +08:00


然而这个自动化功能已经影响了很多系统的正常运行,晚上10点对于大部分生产系统也并非空闲时段。

而自动分析可能导致极为严重的闩锁竞争,进而可能导致数据库Hang或者Crash。

所以建议最好关闭这个自动统计信息收集功能:

关闭及开启自动搜集功能,有两种方法,分别如下:

方法一:

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;


---------------------------------------

查看统计

---------------------------------------

表/索引/列上的统计

DBA_TABLES

DBA_OBJECT_TABLES

DBA_TAB_STATISTICS

DBA_TAB_COL_STATISTICS

DBA_TAB_HISTOGRAMS

DBA_INDEXES

DBA_IND_STATISTICS

DBA_CLUSTERS

DBA_TAB_PARTITIONS

DBA_TAB_SUBPARTITIONS

DBA_IND_PARTITIONS

DBA_IND_SUBPARTITIONS

DBA_PART_COL_STATISTICS

DBA_PART_HISTOGRAMS

DBA_SUBPART_COL_STATISTICS

DBA_SUBPART_HISTOGRAMS



对于数据分布统计(Histogram)建议

10g之后,统计信息采集脚本(例如dbms_stats.gather_table_stats)中参数method_opt默认为'FOR ALL COLUMNS SIZE AUTO',FOR ALL COLUMNS SIZE AUTO将自动进行数据分布信息的统计。

可以将method_opt设置为'FOR ALL COLUMNS SIZE 1'避免数据分布信息的统计(在dbms_stats.gather_table_stats中进行设置或通过dbms_stats.set_param(method_opt=>'FOR ALL COLUMNS SIZE 1')来设置)

然后采用手工的方式采集数据分布信息,只有在下面情况下考虑采集数据分布信息:

1.字段数据分布不均匀,并且有索引。

2.应用sql语句没有使用绑定变量

3.字段不是唯一键,并且查询条件不为'='操作


锁住统计信息

还有一些情况,当表或schema的数据记录基本处于稳定状态时,可以通过以下命令锁住统计信息:

exec DBMS_STATS.LOCK_TABLE_STATS('owner_name','table_name');

exec DBMS_STATS.LOCK_SCHEMA_STATS('schema_name');

这样这些表或schema的统计信息将不会被收集,从而节省资源消耗和时间。通过UNLOCK_TABLE_STATS,UNLOCK_SCHEMA_STATS解除锁定。


修改10g自动统计的时间属性

--GATHER_STATS_JOB


--查看SCHEDULER_JOBS

select job_name from dba_scheduler_running_jobs;

SELECT job_name , SCHEDULE_NAME FROM DBA_SCHEDULER_JOBS;


select * from dba_scheduler_wingroup_members where window_group_name='MAINTENANCE_WINDOW_GROUP';

/* WINDOW_GROUP_NAME WINDOW_NAME

1 MAINTENANCE_WINDOW_GROUP WEEKNIGHT_WINDOW

2 MAINTENANCE_WINDOW_GROUP WEEKEND_WINDOW

*/


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='MAINTENANCE_WINDOW_GROUP';

/*

WINDOW_NAME REPEAT_INTERVAL DURATION

1 WEEKNIGHT_WINDOW freq=daily;byday=MON,TUE,WED,THU,FRI;byhour=22;byminute=0; bysecond=0 +000 08:00:00

2 WEEKEND_WINDOW freq=daily;byday=SAT;byhour=0;byminute=0;bysecond=0 +002 00:00:00

*/


--下面修改配置(使用sys用户登录oracle执行)

sqlplus sys/xxx@xxxdb as sysdba

set linesize 120


--修改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;

/


--查看修改结果:

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='MAINTENANCE_WINDOW_GROUP';

/*

WINDOW_NAME REPEAT_INTERVAL DURATION

1 WEEKNIGHT_WINDOW freq=daily;byday=MON,TUE,WED,THU,FRI;byhour=22;byminute=0; bysecond=0 +000 08:00:00

2 WEEKEND_WINDOW freq=daily;byday=SAT,SUN;byhour=22;byminute=0;bysecond=0 +000 08:00:00

*/



--若要还原成以前默认设置,可执行如下

--周末两天都是全天:

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;

/


网上也有手动收集统计信息的脚本,有时间可以揣摩一下。csdn博客系统现在仍在维护,不能访问,只能暂且放到QQ空间了,有空在移过去呀!!!

以上来自http://www.cnblogs.com/rootq/archive/2010/02/04/1663622.html

http://liurizhaooracle.blog.163.com/blog/static/12311087220091130105353326/

品悟性能优化

你可能感兴趣的:(10g)