USER_INDEXES视图为我们提供了很多有价值的信息,深入研究其中列的含义有助于帮助我们优化索引。

1、选择性

        Oracle根据查询和数据,提供了多种方法来判断使用索引的价值。第一个方法是判断索引中的唯一键或不同键的数量。使用USER_INDEXES视图,该视图中显示了distinct_keys列。比较一下唯一键的数量和表中的行数,就可以判断索引的选择性。选择性越高,索引返回的数据就越少。索引的选择性可以帮助基于代价的优化器来判断执行途径。

SQL> select index_name,table_name,num_rows,distinct_keys from user_indexes;

INDEX_NAME TABLE_NA NUM_ROWS DISTINCT_KEYS

------------ -------- ---------- -------------

PK_DEPT DEPT 4 4

PK_EMP EMP 14 14

EMPT_ID1 EMPT 14 14

EMPT_ID2 EMPT 14 12

BANK_ID BANK 2 2

已选择6行。

2、群集因子

Clustering_factor列位于USER_INDEXES视图中。该列反映了数据相对于已索引的列是否显得有序。如果clustering_factor列的值接近于索引中的树叶块(leaf_block)的数目,表中的数据就越有序。如果它的值接近于表中的行数,则表中的数据就不是很有序。

3、二元高度(binary height)

    索引的二元高度对把ROWID返回给用户进程时所要求的I/O量起到关键作用。二元高度的每个级别都会增加一个额外的读取块,而且由于这些块不能按顺序读取,它们都要求一个独立的I/O操作。

SQL> execute dbms_stats.gather_index_stats('SCOTT','EMPT_ID1');

PL/SQL过程已成功完成。

SQL> select blevel,index_name from user_indexes where index_name='EMPT_ID1';

BLEVEL INDEX_NAME

---------- ------------

0 EMPT_ID1

注:索引在创建时就已经进行了分析。

二元高度主要随着表的大小以及被索引的列中值的范围的狭窄程度而变化。索引上如果有大量被删除的行,它的二元高度也会增加。更新索引列也类似于删除操作,因为它增加了已删除键的数目。重建索引可能降低二元高度。

技巧一:如果一个索引中被删除的行接近20~25%,重建索引会降低二元高度以及在一次I/O中所读取的空闲空间。

技巧二:通常数据库块的尺寸越大,索引的二元高度就越小。

技巧三:在BLEVEL中每增加一个级别都会增加DML操作的性能开销。