Oracle 全表扫描和聚簇因子

全表扫描

全表扫描时,ORACLE会读取表中高水位线(HWM)下所有的数据块。

DELETE方法不会改变高水位线,TRANCATE会使HWM回零。

全表扫描不会出现Flush Buffer Cache现象,数据块放在LRU一端,很快可以被覆盖掉。

全表扫描是多块读方法,每次读取数据块的数量是DB_FILE_MULTIBLOCK_READ_COUNT参数控制。

Selectivity(选择率)小于0.1%时,使用索引好。选择率在0.1%~20%间自行取舍。大于20%通常选择全表扫描效率更高一些。

聚簇因子(CLUSTERING_FACTOR)

DBA_INDEXES视图CLUSTERING_FACTOR反应了索引列的分布特点。

此外还有DBA_TABLES视图的AVG_ROW_LEN,

还有DB_BLOCK_SIZE一起影响CBO决策。

这几个数值这样查:

SQL>SELECT INDEX_NAME, TABLE_NAME, UNIQUENESS, BLEVEL, CLUSTERING_FACTOR FROM DBA_INDEXES;

SQL> SELECT TABLE_NAME, AVG_ROW_LEN FROM DBA_TABLES;

在索引中,索引项肯定是按照顺序保存的。如果记录在表中的顺序也是这个顺序,CLUSTERING_FACTOR就是一个较小的数值。最理想是CLUTERING_FACTOR等于DBA_TABLES.BLOCKS,也就是和表占用数据块数量相等。

对比两者数量:

SQL> SELECT A.TABLE_NAME, A.INDEX_NAME, A.CLUSTERING_FACTOR, B.BLOCKS FROM DBA_INDEXES A, DBA_TABLES B WHERE A.TABLE_NAME=B.TABLE_NAME;

一般来说

DBA_TABLES.BLOCKS <=DBA_INDEXES.CLUSTERING_FACTOR<=DBA_TABLES.NUM_ROWS

越小越好,越大越糟糕。


你可能感兴趣的:(oracle,索引,聚簇因子)