全表扫描
全表扫描时,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
越小越好,越大越糟糕。