1. 概念
聚簇因子认为是根据索引遍历一遍实体表的逻辑读的块数。因为数据读取方式以块为单位,不是行,因此在读取大范围数据(满足条件行很多,不是unique index scan)时,利用聚簇因子好的索引,其读取块少,读取效率会很高。
2. 聚簇因子的评价
若聚簇因子大于表块的10倍左右,且需要返回1000多行记录,此索引就不能用了,不如用全表扫描。
若聚簇因子和表块的大小很接近,此说明表有序,索引的同一个叶子节点索引条目执行同一个实体表数据块。且需要返回1000多行记录,比较适合用索引来扫描。
先查索引叶节点,取每行得到rowid,再根据rowid去实体表中查询,但是聚簇因子很大的话,连续的rowid很随机,无法实现连续读取。通过如下sql可以进行索引 聚簇因子的比较
analyze table T2012012401 estimate statistics; --获得T2012012401表在usr_table视图中的数据
SELECTA.INDEX_NAME,A.LEAF_BLOCKS,A.DISTINCT_KEYS,A.CLUSTERING_FACTOR,A.STATUS,A.NUM_ROWSAS INDEX_NUM_ROWS,
B.NUM_ROWSASTABLE_NUM_ROWS,B.BLOCKS,B.AVG_ROW_LEN
FROM user_indexes A,USER_TABLES B WHERE INDEX_NAME IN ('IDX_TEST1','IDX_TEST2') ANDA.TABLE_NAME=B.TABLE_NAME;
上图中的聚簇因子都是13890和表行数41288很接近,与数据块244差距很大,不适用索引来 来代替表进行大部分的扫描工作
3. 对于堆表,在存储数据时,用order by等技术,按一定顺序插入,可提供某个索引的 聚簇因子
CREATE TABLE T2012012401
TABLESPACE NETMAXTEST
AS
SELECT ROWNUM AS RN,A.* FROM ALL_OBJECTS A;
CREATE TABLE T2012012402
TABLESPACE NETMAXTEST
AS
SELECT ROWNUM AS RN,A.* FROM ALL_OBJECTS A order by OBJECT_NAME desc;
CREATE INDEX T2012012402_RN ON T2012012402(RN);
CREATE INDEX T2012012402_NAME ON T2012012402(OBJECT_NAME)
analyze table T2012012401 estimate statistics;
analyze table T2012012402 estimate statistics;
SELECT A.INDEX_NAME,A.CLUSTERING_FACTOR,B.NUM_ROWS AS TABLE_NUM_ROWS,B.BLOCKS,A.LEAF_BLOCKS,A.DISTINCT_KEYS,
A.STATUS,A.NUM_ROWS AS
INDEX_NUM_ROWS,
B.AVG_ROW_LEN
FROM user_indexes A,USER_TABLES B WHERE INDEX_NAME
IN ('T2012012401_RN','T2012012401_NAME','T2012012402_RN','T2012012402_NAME')
AND A.TABLE_NAME=B.TABLE_NAME
得到
第二个表安装object_name进行排序的,所以集聚好很多,且下面例子证明查询大访问(1000内,若大于1000则可能用全表扫描了),第二个表性能是第一个的一倍。
select * from T2012012401 where object_name>'sun/rmi/transport/Target$1'
select * from T2012012402 where object_name>'sun/rmi/transport/Target$1'