【问题标题】:How to get Detailed Explain Plan?如何获得详细的解释计划?
【发布时间】:2015-07-31 02:19:54
【问题描述】:

我过去在管理工作室工作,记得解释/查询计划是描述性的,就像过去所说的那样

1) 触发语句的顺序

2) 每条语句返回的行数

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

【问题讨论】:

    标签: database oracle performance sql-execution-plan


    【解决方案1】:

    语句的触发顺序

    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

    【讨论】:

    • 谢谢拉利特。我下载了该实用程序,但不确定如何获取最后执行语句的计划。我尝试的是:- 解释 Select * from .... 的计划,然后使用参数(“PLAN_TABLE”、NULL、“TYPICAL”)运行 xplan.display.sql
    • 要获得最后解释的 SQL 语句的计划,只需在 SQL*Plus 中执行为:@xplan.display.sql
    • 当我从 sqlplus 运行 @xplan.display.sql 时,它说 Error: cannot fetch last explain plan from PLAN_TABLE
    • @emilly 你确定吗?因为它对我有用。你能不能只执行 SQL(没有解释计划)然后运行@xplan.display.sql。如果您仍然遇到问题,请检查上一个 SQL 的 statement_id 并将其作为参数传递给脚本。应该管用。如果您打开脚本,顶部会给出不同使用方式的示例。
    • @emilly 该脚本是否也适用于 SQL Developer?我的意思是,你是作为外部脚本运行的吗?无论如何,我很高兴你让它工作了。
    猜你喜欢
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2020-03-26
    • 2021-12-11
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    相关资源
    最近更新 更多