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

时间:2008-09-23 18:15:35

标签: oracle

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

3 个答案:

答案 0 :(得分:7)

使用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给我答案的所有人,这些人帮助我学会了如何做到这一点。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

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