索引快速全扫描(INDEX FAST FULL SCAN)
索引快速全扫描和索引全扫描极为类似,它也适用于所有类型的B+树索引(包括唯一性索引和非唯一性索引)。和索引全扫描一样,索引快速全扫描也需要扫描目标索引所有叶子块的所有索引行。
索引快速全扫描与索引全扫描相比有如下三点区别。
a)索引快速全扫描只适用于CBO。
b)索引快速全扫描可以使用多块读,也可以并行执行。
c)因为索引快速全扫描是根据索引行在磁盘上的物理存储顺序来扫描,而不是根据索引树的指针顺序来扫描的,所以返回结果是无序的
索引全扫描(INDEX FULL SCAN)
索引全扫描一般会扫描所有叶子节点。它从第一个叶子节点开始扫描,通过叶子节点的链接依次访问每一个叶子节点。
索引全扫描有以下几个特点:
a)由于叶子节点是有序的,所以扫描结果也是有序的。
b)由于叶子块之间是指针关联的,所以对叶子块只能使用单块读
c)如果需要访问表,由于每一条数据都需要使用rowid访问,它的效率比全表扫描低的多。
索引范围扫描(INDEX RANGE SCAN)
索引范围扫描跟索引唯一扫描类似,从根节点一直扫描到叶子节点,每一层(不包括叶子节点)扫描一个索引块。它们的区别是,索引唯一扫描在叶子块里最多只能找到一条目标数据,而索引范围扫描可能找到N条目标数据(N>=0)。由此可见,索引唯一扫描实际是索引范围扫描的一个特例。
只有第一次是从根节点下来的,后面的访问都是根据叶子块的指针来访问的。
索引唯一扫描(INDEX UNIQUE SCAN)
当根据主键或唯一索引查询数据时,可以使用索引唯一扫描。这种查询的代价非常小,因为它最多从索引树中查出一条数据。索引唯一扫描在访问索引时最多访问的数据块数就是索引树的高度,而索引数一般不会超过4层,所以它的查询速度很快。
从执行计划看,首先执行索引唯一扫描(INDEX UNIQUE SCAN),然后TABLE ACCESS BY INDEX ROWID,这一步的含义是根据索引中的rowid访问表数据。最后是SELECT STATEMENT。
PS:如果索引中包含要查询的所有数据,则不会ROWID,而是TABLE ACCESS BY INDEX ONLY。