oracle索引的统计信息是用来描述索引的详细信息,包括索引的层级,叶子块的数量,聚簇因子等典型的纬度。
这些纬度的信息实际上是存储在数据字典基表 IND$,INDPART$,INDCOMPART$,INDSUBPART$等中,可以通过
数据字典DBA_INDEXEX,DBA_IND_PARTITIONS和DBA_IND_SUBPARTITIONS来分别查看索引,分区索引和局部分区索引的子分区的统计信息。
以下是oracle数据库里面的B树索引的结构和特点。

数据字典中的blevel字段存储的就是索引的层级,它描述的从根节点到叶子块的深度,blevel被cbo用于计算访问索引叶子块的成本。从图中可以看出,blevel的值
越大,则从根节点到叶子块所需要访问的数据块的数量就会越多,耗费的io就会越多。成本越大。blevel的值从0开始算起,当为0时,表示b树索引只有一层,且根节点和叶子块就是同一个块。
显然,图中的blevel为2.
如果要降低目标b树索引的层级,可以通过rebuild的方式实现。
以下是一个例子:
create table t1 as select * from dba_objects;
create index idx_t1 on t1(object_id)
analyze index idx_t1 validate structure

可以看到该索引字段的叶子块为153个,height=blevel+1,高度为2。
delete from t1 where rownum<68913;
select count(*) from t1;
analyze index idx_t1 validate structure;

如果此时不重建索引,则LF_BLKS的数量是不会变化的,这个值被cbo用于计算对目标索引做索引全扫描(index full scan)
和索引范围扫描(index range scan)的成本,目标索引叶子块的数量越多,则对目标索引做索引全扫描和索引范围扫描的成本值会越大。
alter index idx_t1 rebuild;
analyze index idx_t1 validate structure;

重建索引后,收集的统计信息才是最真实的。
字典中distinct_keys存储的就是目标索引的索引键值的distinct值的数量。对于唯一性索引而言,在没有null值的情况下,distinct_keys的值就等于对应表的记录数。
字段中AVG_LEAF_BLOCKS_PER_KEY存储的就是目标索引的每个distinct索引键值所占用的叶子块数量的平均值,对于唯一性索引而言,这个值显然为1。
字段中AVG_DATA_BLOCKS_PER_KEY存储的就是目标索引的每个distinct索引键值所对应表中的数据行所在的数据块数量的平均值。
字典中num_rows存储的就是目标索引的索引行的数量。
下一节,将重点介绍聚簇因子。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30109892/viewspace-1826221/
,如需转载,请注明出处,否则将追究法律责任。