在介绍索引统计信息之前,我们来根据图8-5简要回顾一下索引的结构。处于顶端的数据块称为根块(root block)。这个块就是每次查询的起始块。根块又引用分支块(branch block)。注意,也可以将根块看作一个分支块。每个分支块又相应地引用另一级别的分支块,或者如图8-5所示,引用叶子块(leaf
block)。
叶子块存储键值(在本例中,键值是在6到89之间的一些数字),并存储引用数据的rowid。对于任何一个给定的索引,根块和每个叶子块之间的分支块的数量永远是相同的。换句话说,索引永远是平衡的。注意,为支持高效率的范围值查找(例如,在25和45之间的所有值),叶子块都互相链接起来。
并非所有索引都具有这三种类型的块。实际上,分支块只有在根块无法存储引用的所有叶子块时才会出现。此外,如果索引非常小,那么它会由一个单独的块组成,并包含通常由根块和叶子块存储的所有数据。
下面的查询展示了如何获取一张表最重要的索引统计信息:
COLUMN name FORMAT A10
COLUMN blevel FORMAT 9
COLUMN leaf_blks FORMAT 99999
COLUMN dst_keys FORMAT 99999
COLUMN num_rows FORMAT 99999
COLUMN clust_fact FORMAT 99999
COLUMN leaf_per_key FORMAT 99999
COLUMN data_per_key FORMAT 99999
SELECT index_name AS name,
blevel,
leaf_blocks AS leaf_blks,
distinct_keys AS dst_keys,
num_rows,
clustering_factor AS clust_fact,
avg_leaf_blocks_per_key AS leaf_per_key,
avg_data_blocks_per_key AS data_per_key
FROM user_ind_statistics
WHERE table_name = 'T';
这个查询返回的索引统计信息如下所示。
Ø blevel 是为了访问叶子块而需要读取的分支块的数量,包含根块在内。
Ø leaf_blocks 是索引的叶子块数量。
Ø distinct_keys 是索引中不重复键值的数量。
Ø num_rows 是索引中键值的数量。对于主键,这个值与distinct_keys相等。
Ø clustering_factor表明有多少相邻的索引条目没有指向表中相同的数据块。如果表和索引存储数据的顺序相类似,则群集因子(clustering_factor)较低。其最小值是表中非空数据块的数量。如果表和索引存储数据的顺序不同,则群集因子较高。其最大值是索引中键值的数量。有必要提一下,对于bitmap索引,不会计算实际意义上的群集因子。实际上,会将其值设置为索引的键值数量。
Ø avg_leaf_blocks_per_key 是存储一个单独的键值所需的平均叶子块数量。这个值是使用公式8-2通过其他的统计信息计算得来的。
公式8-2 计算存储一个单独的键值所需叶子块的平均数量
Ø avg_data_blocks_per_key 是在表中某个单独的键值所引用的数据块平均数量。这个值是使用公式8-3通过其他的统计信息计算得来的。
公式8-3 计算某个单独的键值所引用的数据块平均数量