Oracle用EXPLAIN PLAN分析SQL语句的方法是本文我们主要要介绍的内容,我们知道,EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句。 通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称。
你需要按照从里到外,从上到下的次序解读分析的结果. EXPLAIN PLAN分析的结果是用缩进的格式排列的, 最内部的操作将被最先解读, 如果两个操作处于同一层中,带有最小操作号的将被首先执行。
NESTED LOOP是少数不按照上述规则处理的操作,正确的执行路径是检查对NESTED LOOP提供数据的操作,其中操作号最小的将被最先处理。
通过实践,感到还是用SQLPLUS中的SET TRACE 功能比较方便。
举例:
class="dp-xml">
- SQL> list
- 1 SELECT *
- 2 FROM dept, emp
- 3* WHERE emp.deptno = dept.deptno
- SQL> set autotrace traceonly /*traceonly 可以不显示执行结果*/
- SQL> /
- 14 rows selected.
- Execution Plan
- ----------------------------------------------------------
- 0 SELECT STATEMENT Optimizer=CHOOSE
- 1 0 NESTED LOOPS
- 2 1 TABLE ACCESS (FULL) OF 'EMP'
- 3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
- 4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
- Statistics
- ----------------------------------------------------------
- 0 recursive calls
- 2 db block gets
- 30 consistent gets
- 0 physical reads
- 0 redo size
- 2598 bytes sent via SQL*Net to client
- 503 bytes received via SQL*Net from client
- 2 SQL*Net roundtrips to/from client
- 0 sorts (memory)
- 0 sorts (disk)
- 14 rows processed
通过以上分析,可以得出实际的执行步骤是:
1.TABLE ACCESS (FULL) OF 'EMP'
2.INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)
3.TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
4.NESTED LOOPS (JOINING 1 AND 3)
注意:目前许多第三方的工具如TOAD和ORACLE本身提供的工具如OMS的SQL Analyze都提供了极其方便的EXPLAIN PLAN工具,也许喜欢图形化界面的朋友们可以选用它们。
关于Oracle用EXPLAIN PLAN分析SQL语句的知识就介绍到这里了,希望本次的介绍能够对您有所收获!