如何获得详细的解释计划?

时间:2015-05-19 10:02:55

标签: database oracle performance sql-execution-plan

我过去曾在管理工作室工作,并且记得解释/查询计划是描述性的,就像它用来告诉

一样

1)将触发陈述的顺序

2)每个语句返回的行数

我正在使用"解释计划"由OracleSQL开发人员,但我没有看到上述功能。还有其他好的免费工具吗?

1 个答案:

答案 0 :(得分:3)

  

将触发哪些陈述的命令

Adrian Billington创建了一个“XPlan Utility”,以扩展DBMS_XPLAN的输出以包含步骤的执行顺序。以下输出显示默认输出与Adrian的XPlan Utility生成的输出之间的差异。

例如,

EXPLAIN PLAN FOR
SELECT *
FROM   emp e, dept d
WHERE  e.deptno = d.deptno
AND    e.ename  = 'SMITH';

SET LINESIZE 130

-- Default Output
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------
Plan hash value: 3625962092

----------------------------------------------------------------------------------------
| Id  | Operation                    | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |         |     1 |    58 |     3   (0)| 00:00:53 |
|   1 |  NESTED LOOPS                |         |       |       |            |          |
|   2 |   NESTED LOOPS               |         |     1 |    58 |     3   (0)| 00:00:53 |
|*  3 |    TABLE ACCESS FULL         | EMP     |     1 |    38 |     2   (0)| 00:00:35 |
|*  4 |    INDEX UNIQUE SCAN         | PK_DEPT |     1 |       |     0   (0)| 00:00:01 |
|   5 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    20 |     1   (0)| 00:00:18 |
----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("E"."ENAME"='SMITH')
   4 - access("E"."DEPTNO"="D"."DEPTNO")

18 rows selected.

SQL>

让我们看看扩展计划,看看步骤的顺序。请参阅 ORD 列:

-- XPlan Utility output
@xplan.display.sql

PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
Plan hash value: 3625962092

----------------------------------------------------------------------------------------------------
| Id  | Pid | Ord | Operation                    | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 |     |   6 | SELECT STATEMENT             |             |     1 |    58 |     3   (0)| 00:00:53 |
|   1 |   0 |   5 |  NESTED LOOPS                |             |       |       |            |          |
|   2 |   1 |   3 |   NESTED LOOPS               |             |     1 |    58 |     3   (0)| 00:00:53 |
|*  3 |   2 |   1 |    TABLE ACCESS FULL         | EMP         |     1 |    38 |     2   (0)| 00:00:35 |
|*  4 |   2 |   2 |    INDEX UNIQUE SCAN         | PK_DEPT     |     1 |       |     0   (0)| 00:00:01 |
|   5 |   1 |   4 |   TABLE ACCESS BY INDEX ROWID| DEPT        |     1 |    20 |     1   (0)| 00:00:18 |
----------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("E"."ENAME"='SMITH')
   4 - access("E"."DEPTNO"="D"."DEPTNO")

About
------
  - XPlan v1.2 by Adrian Billington (http://www.oracle-developer.net)


18 rows selected.

SQL>
  

每个语句返回的行数

SQL Developer 中,解释计划窗口包含基数列,其中显示行数

SQL * Plus 中,使用 DBMS_XPLAN ,您可以以可读格式显示。 行列显示行数

How to create and display explain plan in SQL*Plus。几个很好的例子和用法here