【问题标题】:Explain Plan for Query in a Stored Procedure解释存储过程中的查询计划
【发布时间】:2008-09-23 18:15:34
【问题描述】:

我有一个存储过程,它包含一个选择查询,用于插入另一个表,该查询基于对过程中的参数进行的一些次要数学运算。我可以通过以某种方式引用过程来生成用于此查询的计划,还是必须复制和粘贴查询并为输入参数创建绑定变量?

【问题讨论】:

    标签: oracle


    【解决方案1】:

    使用SQL Trace and TKPROF。例如,打开 SQL*Plus,然后发出以下代码:-

    alter session set tracefile_identifier = 'something-unique'
    alter session set sql_trace = true;
    alter session set events '10046 trace name context forever, level 8';
    
    select 'right-before-my-sp' from dual;
    exec your_stored_procedure
    
    alter session set sql_trace = false;
    

    完成此操作后,请在数据库的 UDUMP 目录中查找文件名中带有“something-unique”的 TRC 文件。用 TKPROF 格式化这个 TRC 文件,然后打开格式化的文件并搜索字符串“right-before-my-sp”。您的存储过程发出的 SQL 命令应该在本节之后不久,并且紧接在该 SQL 语句的下方将是 SQL 语句的计划。

    编辑:出于全面披露的目的,我要感谢上周在this thread 上给我答案的所有人,他们帮助我学习了如何做到这一点。

    【讨论】:

    • 我必须将它传递给小组中的其他人,他们上周才让我开始使用 SQL Trace 和 TKPROF。
    【解决方案2】:

    据我了解,这是故意的。这个想法是优化器单独考虑过程中的各个查询,因此 EXPLAIN PLAN 对可能包含多个查询/语句的存储过程没有意义。

    当前的答案是否定的,您不能针对 proc 运行它,您必须针对各个语句本身运行它。当你有变量和计算时会很棘手,但就是这样。

    【讨论】:

      【解决方案3】:

      当您执行解释计划时,许多工具(例如 Toad 或 SQL Developer)会提示您输入绑定变量值。您必须在 SQL*Plus 或其他工具中手动执行此操作。

      您也可以开启 SQL 跟踪并执行存储过程,然后从跟踪文件中检索解释计划。

      注意不要只检索 SELECT 语句的解释计划。 INSERT 子句的存在可以将优化器目标从第一行更改为所有行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-09
        • 1970-01-01
        • 2011-05-29
        • 2017-07-30
        • 1970-01-01
        • 2020-11-29
        相关资源
        最近更新 更多