oracle 索引统计信息

2023年 9月 25日 22.6k 0

在介绍索引统计信息之前,我们来根据图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 计算某个单独的键值所引用的数据块平均数量

 

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论