要执行任何SQL语句,Oracle 必须推导出一个“执行计划”。查询的执行计划是 Oracle 将如何实现数据的检索,以满足给定 SQL 语句的描述。它只不过是其中包含的步骤及它们之间关系的顺序树。
执行计划树的基本规则如下:
执行计划将包含一个根,没有父(操作)
父(操作)可以有一个或更多的子(操作),其ID将小于子(操作)ID
一子(操作)可只有一个父(操作),显示时右缩进;含许多子(操作)时,缩进相同
下面是一个执行计划示例。
SQL> explain plan for
2 select e.empno, e.ename, d.dname
3 from emp e, dept d
4 where e.deptno = d.deptno
5 and e.deptno = 10;
Explained.
SQL> SELECT * FROM table(dbms_xplan.display(null,null,‘basic‘));
PLAN_TABLE_OUTPUT
------------------------------------------------
Plan hash value: 568005898
------------------------------------------------
| Id | Operation | Name |
------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | NESTED LOOPS | |
| 2 | TABLE ACCESS BY INDEX ROWID| DEPT |
| 3 | INDEX UNIQUE SCAN | PK_DEPT |
| 4 | TABLE ACCESS FULL | EMP |
------------------------------------------------
使用上述的规则,可以说:
操作0是树的根,它有一个子操作,即操作1
操作1有两个子操作,即操作2和4
操作2有一子操作,即操作3
下面是执行计划的图形表示。如果解读该树:为执行操作1,需执行操作2和4;操作2先完成;为执行2,需执行其子操作3;为执行操作4,需执行操作2。
Operation 0
(SELECT STATEMENT)
|
|
|
Operation 1
(NESTED LOOPS)
/\
/ \
/ \
/ \
/ \
/ \
/ \
/ \
Operation 2 Operation 4
(TABLE ACCESS (TABLE ACCESS FULL)
BY INDEX ROWID)
|
|
|
Operation 3
(INDEX UNIQUE SCAN)
操作3访问DEPT表,使用 INDEX UNIQUE SCAN,并传递ROWID给操作2
操作2从DEPT表返回所有行给操作1
操作1对操作2返回的每一行执行操作4
操作4执行全表扫描(TABLE ACCESS FULL),应用过滤器E. DEPTNO = 10,返回结果行给操作1
操作1返回最后结果给操作0
原文:http://www.cnblogs.com/daishuguang/p/5106335.html