读书人

深入了解Oracle索引(2):INDEX UNIQUE

发布时间: 2013-02-19 11:11:40 作者: rapoo

深入理解Oracle索引(2):INDEX UNIQUE SCAN,INDEX FULL SCAN和INDEX FAST FULL SCAN
㈠ INDEX UNIQUE SCAN

果表上有唯一索引, 搜索索引列时会用上INDEX UNIQUE SCAN

原来Index Unique Scan和Index Range Scan在B Tree上的搜索路径是一样的
只是Index Unique Scan在找到应该含有要找的Index Key的block后便停止了搜索,因为该键是唯一的
而Index Range Scan还要循着指针继续找下去直到条件不满足时

Oracle9i Database Performance Tuning Guide and Reference提到:
This access path is used when all columns of a unique (B-tree) index are specified with equality conditions

下面测试一下这句话的真实性:

sys@ORCL> select index_name,blevel,leaf_blocks from user_indexes where table_name=upper('T');INDEX_NAME                         BLEVEL LEAF_BLOCKS------------------------------ ---------- -----------IDX_T                                   1         282

FAST是多块读,结果集无顺序,如果需要排序则会多一步sort order by;FULL SCAN是单块读,有顺序,可避免ORDER BY成本
Performance Tuning Guide中描述如下:
Index Full Scan可以避免排序操作,在如下情况下,优化器将使用IFS
1.若谓词引用了索引中的字段
2.若查询中的所有字段都包含在索引中,并且索引字段中至少有一个字段非空

Index Fast Full Scan
查询中的所有字段都包含在索引中且至少一个索引列有非空约束的情况下,才会进行IFFS
IFFS只访问索引,不需要访问数据表,通过读取多个数据块的方式读取整个索引,并不是根据索引的键值进行排序
如果加个ORDER BY,则FAST会变成IFS,如果索引中没有完全包含要查询的列,或可能INDEX FULL SCAN,或可能直接访问表
IFFS通过读取多个数据块的方式读取整个索引,且可进行并行处理,相关数据并不是根据索引的键值进行排序
因此,速度比IFS快,但它不能用于避免排序操作

读书人网 >其他数据库

热点推荐