CLUSTERING_FACTOR表示表上数据的存储顺序和索引字段的顺序符合的程度,clustering_factor主要影响index range scan
1、表中数据的存放顺序按object_id存放,索引也建在object_id列上。
预测:因为数据在表中存放顺序和索引顺序一致,,clustering_factor和表数据块个数应该相近。
SQL> drop table test;
Table dropped.
SQL> create table test as select * from dba_objects order by object_id;
Table created.
SQL> create index idx_test_object_id on test(object_id);
Index created.
SQL> analyze table test compute statistics for table for all indexes for all indexed columns;
Table analyzed.
SQL> select table_name,blocks,num_rows from user_tables where table_name='TEST';
TABLE_NAME BLOCKS NUM_ROWS
------------------------------ ---------- ----------
TEST 705 49842
SQL> select clustering_factor from user_indexes where index_name='IDX_TEST_OBJECT_ID';
CLUSTERING_FACTOR
-----------------
685
表数据块数是705,索引聚簇因子是685,接近。发现聚簇因子比数据块数还要少,这是为什么?其实只要稍加注意就会了解到,数据块中不只包含数据还包含一些其他控制信息,而clustering_factor只包含有数据。
2、表中数据按object_name顺序存放,索引建在object_id列上。
预测:表中数据存放顺序和索引排序顺序不一定一致,所以聚簇因子会远远大于数据块数。
SQL> drop table test;
Table dropped.
SQL> create table test as select * from dba_objects order by object_name;
Table created.
SQL> create index idx_test_object_id on test(object_id);
Index created.
SQL> analyze table test compute statistics for table for all indexes for all indexed columns;
Table analyzed.
SQL> select table_name,blocks,num_rows from user_tables where table_name='TEST';
TABLE_NAME BLOCKS NUM_ROWS
------------------------------ ---------- ----------
TEST 705 49842
SQL> select clustering_factor from user_indexes where index_name='IDX_TEST_OBJECT_ID';
CLUSTERING_FACTOR
-----------------
36531
表中数据块数705,数据行49842,聚簇因子36531.聚簇因子远远大于表中数据块数,更接近于表中数据行数。
关于clustering_factor的计算方法:
因为索引是排序的,所以oracle会先找到表中物理存储的第一行,该行的clustering_factor=1;
再看物理存储的第二行,如果该行与第一行在同一个数据块,聚簇因子clustering_factor还是1不会增加,否则加1;
依次类推,直到表中所有行都计算完。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24496749/viewspace-723294/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24496749/viewspace-723294/