查看SQL的执行计划可用以下几种方式:
- explain plan for sql_statement
- SQLPLUS命令set autotrace on|traceonly
- 第三方软件,如Toad,PL/SQL Developer
如何看懂一个执行计划呢,下面看这样一个执行计划:
select empno,ename,dname,loc from emp natural join dept where deptno=10;
Execution Plan
----------------------------------------------------------
Plan hash value: 568005898
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 165 | 4 (0)| 00:00:01 |
| 1 | NESTED LOOPS | | 5 | 165 | 4 (0)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID| DEPT | 1 | 20 | 1 (0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN | PK_DEPT | 1 | | 0 (0)| 00:00:01 |
|* 4 | TABLE ACCESS FULL | EMP | 5 | 65 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("DEPT"."DEPTNO"=10)
4 - filter("EMP"."DEPTNO"=10)
看执行计划时,首先从缩进最大的行读取,它是首先被执行的步骤。在上面的执行计划中,ID=3是最先被执行的,然后是2和4,当两行缩进一样时,最上面的先被执行,这里就是先执行2(3即是2的执行)再执行4,然后是1,最后执行0。即执行顺序是:
3 --2--4--1--0
执行过程可描述成:
首先从dept表中通过索引读取deptno=10的记录,然后全表扫描emp表,找到deptno=10的记录。然后重复这个过程直到dept表扫描完。这个过程就是nested loops。再dept表被扫描完之后,会产生一个结果集,将结果集返回给SELECT STATEMENT。
ID列带*号,说明后面会给出数据获取的方式:
3 - access("DEPT"."DEPTNO"=10),表示通过索引访问deptno=10的数据;
4 - filter("EMP"."DEPTNO"=10),在全部记录中过滤deptno=10的记录。
access表示这个谓词条件将会影响数据的访问路径(表还是索引),而filter表示谓词条件不会影响数据访问路径,只起到过滤作用。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25791987/viewspace-719976/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25791987/viewspace-719976/