INDEX FULL SCAN 与 INDEX FAST FULL SCAN两个长相差不多,乃是一母同胞,因此既有其共性,也有其个性。两者来说其共性是不用扫描
表而是通过索引就可以直接返回所需要的所有数据。这对提高查询性能而言,无疑是一个难得的数据访问方式之一,因为索引中存储的数据通常
是远小于原始表的数据。下面具体来看看两者之间的异同。
一、何时INDEX FULL SCAN 或 INDEX FAST FULL SCAN
1、select 与where子句中出现的所有列必须存在索引
2、查询返回的数据行总数占据整个索引10%以上的比率。取决于db_file_multiblock_read_count值与并行度的值
3、满足像统计行数这样的一些特定的标准,如count(*)这样的操作。count(*)操作几乎总是使用INDEX FAST FULL SCAN
4、对于索引列上order by之类的操作几乎总是使用INDEX FULL SCAN
注: 参数db_file_multiblock_read_count会在index fast full scan 像full table scan一样生效,因为整个索引都被访问,Oracle 此时
允许出现多块读(multiblock_read)。db_file_multiblock_read_count与paralle仅仅对index fast full scan情形。其次paralle在新版Oracle
中是否支持待证实。一旦上述几个条件满足,基于成本的优化器根据表和索引的统计信息来调用 index full scan 或者index fast full scan。
对于index fast full scan可以通过使用提示index_ffs来实现。
二、何谓INDEX FULL SCAN 与 INDEX FAST FULL SCAN
三、INDEX FULL SCAN 与 INDEX FAST FULL SCAN 两者的差异
四、聚合操作count(*)时的INDEX FULL SCAN 与 INDEX FAST FULL SCAN
五、位图索引时的INDEX FULL SCAN 与 INDEX FAST FULL SCAN
在使用位图索引时,index full SCAN 与 index fast full与使用B树索引有相同的表现。需要注意的是位图索引存储null值,在很大程度
上对索引进行压缩。其次位图索引不支持降序扫描方式。此处不再演示位图索引的index full scan 与 index fast full。
六、总结
1、当select和where中出现的列都存在索引是发生index full scan与index fast full scan的前提
2、查询返回的数据行总数占据整个索引10%以上的比率
3、基于上述前提count(*)操作几乎总是选择index fast full scan,而索引列上的order by子句几乎总是选择index full scan
4、index fast full scan使用多块读的方式读取索引块,产生db file scattered reads 事件,读取时高效,但为无序读取
5、index full scan使用单块读方式有序读取索引块,产生db file sequential reads事件,当采用该方式读取大量索引全扫描,效率低下
6、绝大多数情况下,index fast full scan性能优于index full scan,但前者在有order by时,一定会存在对读取的块重新排序的过程
7、index fast full scan通过牺牲内存与临时表空间换取性能,因此在内存不足或饱和状态应进行合理权衡
七、更多参考