关于INDEX FULL SCAN和INDEX FAST FULLSCAN的区别在于,前者在对索引进行扫描的时候会考虑大索引的结构,而且会按照索引的排序,

而后者则不会,INDEX FAST FULL SCAN不会去扫描根块和分支块,对索引像访问堆表一样访问,所以这两个扫描方式用在不同的场合

如果存在ORDER BY这样的排序,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来实现。