[统计信息系列3] 索引的统计信息

[统计信息系列3] 索引的统计信息

(一)索引的统计信息查看

索引的统计信息,可以通过数据字典来查看:

  • DBA_INDEXS:查看索引的统计信息
  • DBA_IND_PARTITIONS:查看索引分区的统计信息
  • DBA_IND_SUBPARTITIONS:查看索引子分区的统计信息

上述表中统计信息核心字段:

BLEVEL:索引的层级,代表索引从根节点到叶子快的深度,BLEVEL的值越大,则根节点到叶子节点要访问的索引块的数量就越多,访问索引的开销就越大。BLEVEL的值从0开始算起,当为0时,表示该B树只有1层,且根节点与叶子节点就是同一个数据块。

LEAF_BLOCKS:存储目标索引叶子块的数量,被CBO用于计算对目标索引做索引全扫描(index full scan)和索引范围扫描(index range scan)的成本。

CLUSTERING_FACTOR:目标索引的集群因子(或者聚簇因子),在Oracle中,聚簇因子是按照索引键值排列的索引行和存储于对应表中数据行的存储顺序的相似程度。

DISTINCT_KEYS:存储目标索引对应索引键的distinct值,对于唯一性索引而言,在没有NULL值的情况下,DINTINCT_KEYS的值等于表的行数。

AVG_LEAF_BLOCKS_PER_KEY:每个distinct索引键所占用的叶子块的数量平均值,对于唯一性索引而言,该值为1。

AVG_DATA_BLOCKS_PER_KEY:每个distinct索引键对应表中数据行所在块数量平均值。

NUM_ROWS:索引行的数量。


(二)索引的历史统计信息查看

索引的历史统计信息可以通过AWR Repository的基表WRI$_OPTSTAT_IND_HISTORY来查看,核心列如下:

OBJ# :对象id,可用过dba_objects查询

SAVTIME :历史统计信息进入该视图的时间

ROWCNT :索引行数

BLEVEL:索引层级

LEAFCNT :索引叶子节点数量

DISKEY :索引键值的distinct数量

CLUFAC:聚簇因子

ANALYZETIME :收集该统计信息的时间

查看方法与表的历史统计信息查看方法类似。


(三)聚簇因子

聚簇因子描述的是按照索引键值排序的索引行和存储于对应表中数据行的存储顺序的相似程度。

(1)聚簇因子计算方式

  • 聚簇因子初始值为1;
  • Oracle先定位到目标索引最左边的叶子块;
  • 从最左边叶子块的第一个索引键开始扫描,在顺序扫描过程中,Oracle会对比当前索引行的rowid和它之前的哪个索引行的rowid(相邻的索引快),如果rowid都指向同一个数据块,则rowid保持不变,如果是指向不同的数据块,则聚簇因子加1;
  • 持续扫描索引,直到扫描完全部索引行;

(2)聚簇因子好坏评估

如果聚簇因子的值接近对应表的数据块数量,说明目标索引行和对应表中数据行的存储顺序相似度非常高。这意味着Oracle走范围索引扫描后取得目标rowid再回去访问表的数据块时,相邻的索引对应的rowid极有可能在同一个表块中,即Oracle在通过索引记录的rowid回表第一次去读取对应的表块并将表块缓存在buffer cache中后,再通过相邻索引行记录的rowid回表第二次去读取对应的表块时,就不需要产生物理I/O了,因为两次访问的是同一个块,已经缓存在了buffer cache中。

如果局促因子的值接近对应表的记录数,则说明目标索引行和存储于对应表中数据行的存储顺序相似程度非常低,这就意味着走范围索引扫描取得rowid再回去访问表的数据时,相邻的索引行对应的rowid极有可能不在同一个数据块中,即Oracle第一次去读取对应的表块并将表缓存在buffer cache中后,再通过相邻索引行记录的rowid回表读取对应数据块时,还要产生物理I/O,因为两次读取的不是同一个块。

总结:

1.聚簇因子在表块的数量与表行的数量之间。

表块的数量<=聚簇因子<=表行的数量

2.聚簇因子高的走索引范围扫描时比相同条件下聚簇因子低的索引要耗费更多的物理I/O,因此聚簇因子越小越好。

(3)聚簇因子调整

重建索引并不能降低聚簇因子,能够降低聚簇因子的唯一方法是对表中的数据按照目标索引的索引键排序后重新存储。



【完】

上一篇:【精华摘抄】SQL查询重复记录


下一篇:javascript – 如何在sqlite中获取最后插入的行id