定制设计信息采集方案,可考虑如下实施策略。
(1)根据数据库规模和数据变化情况,可考虑在数据库、schema、表、分区表等不同级别采集统计信息
(2)设置并行度,提高统计信息采集的效率
(3)进行统计信息采集的目的是保证执行路径的最优化。因此,不一定需要全面采集统计信息,只要执行路径达到最优化,可设定采集率参数estimate_percent
(4)重点对最消耗资源的SQL语种所涉及表的进行统计信息采集
(5)采集表统计信息时,同时采集索引统计信息
(6)对分区表可考虑只对指定分区进行统计信息采集。包括设置granularity=>'PARTITION'
(7)考虑block_sample=>true,method_opt=>'FOR ALL INDEXED' columns等参数,从而提高采样准确性,并减少不必要的统计信息,降低资源消耗
(8)只对没有统计信息或过期统计信息的表进行采集,即options=>'GATHER EMPTY',或options=>'GATHER STALE'
(9)对于字段值分布很畸形(skewed)的表,进行数据分布统计.
(10)合理使用10g统计信息采集方面的新特性
(11)编写统计信息采集工作的脚本
统计信息采集具体方法
Oracle提供了丰富的统计信息采集方法。
(1)数据库级信息采集
建议数据库规模较小、数据变化比较大,而且时间和资源充裕的系统,在整个数据库级采集统计信息。例如:
exec dbms_stats.gather_database_stats(estimate_percent=>10,degree=>8,cascade=>true,granularity => 'ALL');
(2)schema信息采集
exec dbms_stats.gather_schema_stats(ownname=>'CLAS',estimate_percent=>10,degree=>8,cascade=>true,granularity => 'ALL');
(3)表级统计信息采集
建议对数据量较大、数据变化也比较大的表,在表级进行统计信息采集。例如:
exec dbms_stats.gather_table_stats(ownname=>'CLAS',tabname=>'表名',estimate_percent=>10,degree=>8,cascade=>true,granularity => 'ALL');
(4)分区级统计信息采集
建议对数据量较大、数据变化也比较大的分区表,在分区级进行统计信息采集,特别是只采集数据变化较大的分区。例如:
exec dbms_stats.gather_table_stats
(ownname=>'CLAS',tablename=>'表名',partname='分区名',estimate_percent=>10,degree=>8,cascade=>true,granularity => 'PARTITION'
,method_opt=>' FOR ALL INDEXED COLUMNS');
(5)数据字典统计信息采集
exec dbms_stats.gather_dictionary_stats
(estimate_percent=>100,degree=>8,cascade=>true,granularity => 'ALL');
(6)动态性能表统计信息采集
exec dbms_stats.gather_fixed_objects_stats;
(7)硬件统计信息采集
exec dbms_stats.gather_system_stats('START');
在典型业务结束之后,执行如下语句:
exec dbms_stats.gather_system_stats('STOP');
注:它也是通过AWR进行采集的。