Oracle 手动收集统计信息

收集oracle统计信息

优化器统计范围:
表统计:  --行数,块数,行平均长度;all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN;
列统计:  --列中唯一值的数量(NDV),NULL值的数量,数据分布;
          --DBA_TAB_COLUMNS:NUM_DISTINCT,NUM_NULLS,HISTOGRAM;
索引统计: --叶块数量,等级,聚簇因子;
          --DBA_INDEXES:LEAF_BLOCKS,CLUSTERING_FACTOR,BLEVEL;
系统统计:--I/O性能与使用率;
          --CPU性能与使用率;
          --存储在aux_stats$中,需要使用dbms_stats收集,I/O统计在X$KCFIO中;

Dbms_stats

--------------------------------------------
dbms_stats能良好地估计统计数据(尤其是针对较大的分区表),并能获得更好的统计结果,最终制定出速度更快的SQL执行计划。

dbms_stats.gather_database_stats     分析数据库(包括所有的用户对象和系统对象)
dbms_stats.gather_schema_stats       收集SCHEMA下所有对象的统计信息
dbms_stats.gather_table_stats        收集表、列和索引的统计信息
dbms_stats.gather_index_stats        收集索引的统计信息
dbms_stats.gather_system_stats       收集系统统计信息
dbms_stats.gather_dictionary_stats   所有字典对象的统计
dbms_stats.gather_dictionary_stats   其收集所有系统模式的统计

dbms_stats.delete_database_stats     删除数据库统计信息
dbms_stats.delete_schema_stats       删除用户方案统计信息
dbms_stats.delete_table_stats        删除表的统计信息
dbms_stats.delete_index_stats        删除索引的统计信息
dbms_stats.delete_column_stats       删除列统计信息
dbms_stats.export_table_stats        输出表的统计信息
dbms_stats.create_state_table   
    
dbms_stats.set_table_stats           设置表的统计
dbms_stats.set_index_stats           设置索引统计信息:
dbms_stats.set_column_stats          设置列统计信息
dbms_stats.auto_sample_size   

统计收集的权限

==========================
必须授予普通用户权限
sys@ORADB> grant execute_catalog_role to hr;
sys@ORADB> grant connect,resource,analyze any to hr;

统计收集考虑参数

==========================
1 统计收集使用取样(estimate_percent)
不使用抽样的统计收集需要全表扫描并且排序整个表,抽样最小化收集统计的必要资源。
Oracle推荐设置DBMS_STATS的ESTIMATE_PERCENT参数为DBMS_STATS.AUTO_SAMPLE_SIZE在达到必要的统计精确性的同时最大化性能。

2 并行统计收集(degree)
Oracle推荐设置DBMS_STATS的DEGREE参数为DBMS_STATS.AUTO_DEGREE,该参数允许Oracle根据对象的大小和并行性初始化参数的设置选择恰当的并行度。
聚簇索引,域索引,位图连接索引不能并行收集。

3 分区对象的统计收集(Granularity)
对于分区表和索引,DBMS_STATS可以收集单独分区的统计和全局分区,对于组合分区,可以收集子分区,分区,表/索引上的统计,分区统计的收集
可以通过声明参数GRANULARITY。根据将优化的SQL语句,优化器可以选择使用分区统计或全局统计,对于大多数系统这两种统计都是很重要的,Oracle推荐将GRANULARITY设置为AUTO同时收集全部信息。

4 列统计和直方图(METHOD_OPT)
当在表上收集统计时,DBMS_STATS收集表中列的数据分布的信息,数据分布最基本的信息是最大值和最小值,但是如果数据分布是倾斜的,这种级别的统计对于优化器来说不够的,对于倾斜的数据分布,直方图通常用来作为列统计的一部分。
直方图通过METHOD_OPT参数声明,Oracle推荐设置METHOD_OPT为FOR ALL COLUMNS SIZE AUTO,使用该值时Oracle自动决定需要直方图的列以及每个直方图的桶数。也可以手工设置需要直方图的列以及桶数。
如果在使用DBMS_STATS的时候需要删除表中的所有行,需要使用TRUNCATE代替drop/create,否则自动统计收集特征使用的负载信息以及RESTORE_*_STATS使用的保存的统计历史将丢失。这些特征将无法正常发挥作用。

5 确定过期的统计
对于那些随着时间更改的对象必须周期性收集统计,为了确定过期的统计,Oracle提供了一个表监控这些更改,这些监控默认情况下
在STATISTICS_LEVEL为TYPICAL/ALL时启用,该表为USER_TAB_MODIFICATIONS。使用DBMS_STATS.FLUSH_DATABASE _MONITORING_INFO可以立刻反映
内存中超过监控的信息。在OPTIONS参数设置为GATHER STALE or GATHER AUTO时,DBMS_STATS收集过期统计的对象的统计。

6 用户定义统计
在创建了基于索引的统计后,应该在表上收集新的列统计,这可以通过调用过程设置METHOD_OPT的FOR ALL HIDDEN COLUMNS。

7 何时收集统计
对于增量更改的表,可能每个月/每周只需要收集一次,而对于加载后表,通常在加载脚本中增加收集统计的脚本。对于分区表,如果仅仅是一个分区
有了较大改动,只需要收集一个分区的统计,但是收集整个表的分区也是必要的。

特殊说明

1.9i里注意在收集统计信息的时候设置cascade=>true ,否则将不收集索引的统计信息
2.10g里注意estimate_percent为auto_sample_size并不是100%,而且10g里的auto_sample_size采样的值一般比较小,因此建议不要使用默认值,而是设置estimate_percent为30%以上,11g里的auto_sample_size采用的值就比较大,estimate_percent的值太小容易导致sql 的执行计划出现问题
3.method_opt在9i里的设置是for all columns size 1,就是只收集最大值和最小值不收集直方图的信息 ,10g里method_opt的设置for all columns size auto由oracle根据col_usage$里的数据来决定是否收集直方图,因此在oltp的业务中,一定要注意10g里默认收集直方图对应用造成的影响(如bind_peeking,cursor_sharing=similar)

 

--整理自网络

posted @ 2015-04-17 16:29  PoleStar  阅读(2312)  评论(0编辑  收藏  举报