代码之家  ›  专栏  ›  技术社区  ›  Mark Roddy

解释存储过程中的查询计划

  •  8
  • Mark Roddy  · 技术社区  · 16 年前

    我有一个存储过程,它由一个select查询组成,该查询用于根据对过程中的参数所做的一些次要数学运算插入到另一个表中。我是否可以通过某种方式引用过程来生成用于此查询的计划,或者是否必须复制和粘贴查询并为输入参数创建绑定变量?

    3 回复  |  直到 16 年前
        1
  •  7
  •   community wiki 3 revs Mike McAllister    8 年前

    使用 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文件,然后打开格式化文件并搜索字符串“就在我的sp之前”。存储过程发出的SQL命令应该在本节之后不久,并且在该SQL语句的正下方将是SQL语句的计划。

    编辑: 为了充分披露,我应该感谢所有给我答案的人 this thread 上周帮助我学会了如何做到这一点。

        2
  •  1
  •   Jasmine    16 年前

    据我所知,这是故意的。其思想是,优化器单独考虑过程中的各个查询,因此对于存储过程来说,explain计划没有意义,因为存储过程可能包含多个查询/语句。

    当前的答案是否,您不能对一个过程运行它,并且必须对单个语句本身运行它。当你有变量和计算的时候是很棘手的,但事实就是这样。

        3
  •  1
  •   David Aldridge    16 年前

    当您执行一个解释计划时,许多工具(如toad或sql developer)都会提示您输入绑定变量值。您必须在SQL*PLUS或其他工具中手动执行此操作。

    您还可以打开SQL跟踪并执行存储过程,然后从跟踪文件中检索explain计划。

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