分类: Oracle
2009-05-27 16:58:46
统计信息包括下面几类:
表统计:包括记录数、block数和记录平均长度。
列统计:列中不同值的数量(NVD)、空值的数量和数据分布(HISTOGRAM)。
索引统计:索引叶块的数量、索引的层数和聚集因子(CLUSTERING FACTOR)。
系统统计:I/O性能和利用率和CPU性能和利用率。
生成统计信息:
统计信息生成技术包括三种:
基于数据采样的估计方式;
精确计算方式;
用户自定义的统计信息收集方式;
其中采用估算方式可以指定总记录数的估算百分比或者总块数的估算百分比。
分区表的统计信息分为几级:分区表的整体信息、分区的统计信息和子分区的统计信息。
最常用的收集统计信息的方式包括:DBMS_STATS包和ANALYZE语句,Oracle推荐使用DBMS_STATS包来收集统计信息。
DBMS_STATS包中用于收集统计信息的过程包括:
GATHER_TABLE_STATS:收集表、列和索引的统计信息;
GATHER_INDEX_STATS:收集索引的统计信息;
GATHER_SCHEMA_STATS:收集SCHEMA下所有对象的统计信息;
GATHER_DATABASE_STATS:收集数据库中所有对象的统计信息;
GATHER_SYSTEM_STATS:收集系统统计信息。
在CREATE INDEX和ALTER INDEX REBUILD时可以指定COMPUTE STATISTICS语句,对于非分区表重建索引时会收集表、列和索引的统计信息。对于分区表,只收集索引信息,不会收集表和列信息。
可以在将METHOD_OPT参数设置为“FOR ALL HIDDEN COLUMNS SIZE N”来收集函数索引的索引表达式信息。
Oracle根据下列条件来决定使用哪些索引:
索引中的记录数;
索引中不同键值的数量;
索引的层数;
索引中的叶块数;
聚集因子;
每个键值平均叶块数;
如果两个索引的选择性、查询代价和集势都相同,那么优化器会根据索引名称的字母顺序选择索引。
直方图(histograms):
对经常在WHERE语句中使用的且数据的分别十分不均匀的列使用直方图。
当下面三种情况,直方图没有意义:
对这个列所有的判定条件都使用了绑定变量;
列中数据均匀分布;
列中数据唯一且只使用相等作为判定条件。
建立直方图的方式是在收集信息时METHOD_OPT参数给出BUCKETS的个数。例如:exec dbms_stats.gather_table_stats(user, ‘emp’, method_opt => ‘FOR COLUMN SIZE 10 sal’)
直方图有两种类型:
基于高度的直方图:每个范围包括相同数量的值,根据每个范围的终点的列值来判断数据的分布。
基于数值的直方图:当列中不同的值的数量少于或等于直方图的BUCKET数量时,建立数值的直方图。这种直方图列中每个值都有对应的BUCKET,根据每个值对应的BUCKET的个数来判断数据的分布。