ORACLE SQL性能优化系列 (七)

** 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 ** ** 工具 . ** ** 也许喜欢图形化界面的朋友们可以选用它们 . **

(待续)

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus