Oracle 执行计划的一些基本概念(二)

2014-11-24 18:25:34 · 作者: · 浏览: 1
经预先排序好了,所以在执行计划中不需要再对索引列进行排序
SQL> explain plan for select empno, ename from emp


where empno > 7876 order by empno;


Query Plan


--------------------------------------------------------------------------------


SELECT STATEMENT[CHOOSE] Cost=1


TABLE ACCESS BY ROWID EMP [ANALYZED]


INDEX RANGE SCAN EMP_I1 [ANALYZED]



从这个例子中可以看到:因为索引是已经排序了的,所以将按照索引的顺序查询出符合条件的行,因此避免了进一步排序操作。


根据索引的类型与where限制条件的不同,有4种类型的索引扫描:


索引唯一扫描(index unique scan)


索引范围扫描(index range scan)


索引全扫描(index full scan)


索引快速扫描(index fast full scan)


(1) 索引唯一扫描(index unique scan)


通过唯一索引查找一个数值经常返回单个ROWID。如果存在UNIQUE 或PRIMARY KEY 约束(它保证了语句只存取单行)的话,Oracle经常实现唯一性扫描。


使用唯一性约束的例子:


SQL> explain plan for


select empno,ename from emp where empno=10;


Query Plan


------------------------------------


SELECT STATEMENT [CHOOSE] Cost=1


TABLE ACCESS BY ROWID EMP [ANALYZED]


INDEX UNIQUE SCAN EMP_I1


(2) 索引范围扫描(index range scan)


使用一个索引存取多行数据,在唯一索引上使用索引范围扫描的典型情况下是在谓词(where限制条件)中使用了范围操作符(如>、<、<>、>=、<=、between)


使用索引范围扫描的例子:



SQL> explain plan for select empno,ename from emp


where empno > 7876 order by empno;


Query Plan


--------------------------------------------------------------------------------


SELECT STATEMENT[CHOOSE] Cost=1


TABLE ACCESS BY ROWID EMP [ANALYZED]


INDEX RANGE SCAN EMP_I1 [ANALYZED]


在非唯一索引上,谓词col = 5可能返回多行数据,所以在非唯一索引上都使用索引范围扫描。


使用index rang scan的3种情况:


(a) 在唯一索引列上使用了range操作符(> < <> >= <= between)


(b) 在组合索引上,只使用部分列进行查询,导致查询出多行


(c) 对非唯一索引列上进行的任何查询。


(3) 索引全扫描(index full scan)


与全表扫描对应,也有相应的全索引扫描。而且此时查询出的数据都必须从索引中可以直接得到。


全索引扫描的例子:


An Index full scan will not perform single block i/o's and so it may prove to be inefficient.


e.g.


Index BE_IX is a concatenated index on big_emp (empno, ename)



SQL> explain plan for select empno, ename from big_emp order by empno,ename;


Query Plan


--------------------------------------------------------------------------------


SELECT STATEMENT[CHOOSE] Cost=26


INDEX FULL SCAN BE_IX [ANALYZED]