** 24. ** ** 用 EXPLAIN PLAN ** ** 分析 SQL ** ** 语句 **
EXPLAIN PLAN 是一个很好的分析 SQL 语句的工具 , 它甚至可以在不执行 SQL 的情况下分析语句 . 通过分析 , 我们就可以知道 ORACLE 是怎么样连接表 , 使用什么方式扫描表 ( 索引扫描或全表扫描 ) 以及使用到的索引名称 .
你需要按照从里到外 , 从上到下的次序解读分析的结果 . EXPLAIN PLAN 分析的结果是用缩进的格式排列的 , 最内部的操作将被最先解读 , 如果两个操作处于同一层中 , 带有最小操作号的将被首先执行 .
NESTED LOOP 是少数不按照上述规则处理的操作 , 正确的执行路径是检查对 NESTED LOOP 提供数据的操作 , 其中操作号最小的将被最先处理 .
** 译者按 : **
** 通过实践 , ** ** 感到还是用 SQLPLUS ** ** 中的 SET TRACE ** ** 功能比较方便 . **
** 举例 : **
** 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 ** ** 工具 . ** ** 也许喜欢图形化界面的朋友们可以选用它们 . **
(待续)