我们知道clustering_factor是通过oracle的索引得到表数据块的一个因子,实际上表示index列的排列顺序和表中index这个列的排列顺序的关系,在极端的情况下:
1、clustering_factor=表中记录的数目,这表明表中index这个列的存储是随机的。
比如:
SQL> create table t1 as select * from all_objects order by object_name;
表已创建。
SQL> create index t1_i1 on t1(object_id);
索引已创建。
SQL> exec dbms_stats.gather_table_stats(USER,'T1',cascade=>true);
SQL> exec dbms_stats.gather_table_stats(USER,'T1',cascade=>true);
PL/SQL 过程已成功完成。
SQL> SELECT num_rows,blocks FROM user_tables where table_name='T1' ;
NUM_ROWS BLOCKS
---------- --------------
41742 578
SQL> SELECT clustering_factor from user_indexes where index_name='T1_I1';
41742 578
SQL> SELECT clustering_factor from user_indexes where index_name='T1_I1';
CLUSTERING_FACTOR
-----------------
21402
-----------------
21402
(可以这样理解,如果我们要通过index的顺序读完这个表的所有数据块,那么需要查看21402个数据块,你也许觉得奇怪
这个表一共才578个数据块,怎么会需要读21402个块呢? 这是因为由于数据的存放顺序是按object_name来
存放的,通过index通过object_id的顺序来读取表必然导致oracle多次重复读取一个块,而oracle并不会保留它曾经读过的块
的记录,当然在oracle9i中的perfetch功能一定程度上减轻了这个问题)
表数据库的存放顺序是按object_name来排序的,而index是按object_id来排序的,这种情况下,t1_i1的clustering_factor应该接近
表 t1的记录条数。
2、clustering_factor=表中数据块的个数
比如:
SQL> create table t1 as select * from all_objects order by object_id;
表已创建。
SQL> SELECT COUNT(*) FROM T1;
COUNT(*)
----------
41744
----------
41744
SQL> create index t1_i1 on t1(object_id);
索引已创建。
SQL> exec dbms_stats.gather_table_stats(USER,'T1',cascade=>true);
PL/SQL 过程已成功完成。
SQL> SELECT clustering_factor from user_indexes where index_name='T1_I1';
CLUSTERING_FACTOR
-----------------
578
-----------------
578
SQL> select blocks from user_tables where table_name='T1';
BLOCKS
----------
578
----------
578
SQL>
表数据库的存放顺序是按object_id来排序的,而index是按object_id来排序的,这种情况下,t1_i1的clustering_factor应该和表占用空间的块数相当(这个例子恰好相等)。
关于clustering_factor的几个神话
1、通过索引的重建可以减少clustering_factor,这是错误的因为重建index不能改变表中数据存放的顺序,因此也不能改变
clustering_factor。
2、高的clustering_factor意胃这index中的碎片很高,或者有很多的空的叶子块。
3、删除后再创建index可以降低clustering_factor。
需要注意的是clustering_factor主要影响index range scan和对于 index equal的查询影响相对小些。高的clustering_factor对于执行计划来说是绝对不好的,但是我们知道一个表中不可能所有的index clustering_factor都低,因为表的存放顺序是一定的。
--------------------------------转载.....
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24217871/viewspace-677689/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24217871/viewspace-677689/