【发布时间】:2008-09-23 18:15:34
【问题描述】:
我有一个存储过程,它包含一个选择查询,用于插入另一个表,该查询基于对过程中的参数进行的一些次要数学运算。我可以通过以某种方式引用过程来生成用于此查询的计划,还是必须复制和粘贴查询并为输入参数创建绑定变量?
【问题讨论】:
标签: oracle
我有一个存储过程,它包含一个选择查询,用于插入另一个表,该查询基于对过程中的参数进行的一些次要数学运算。我可以通过以某种方式引用过程来生成用于此查询的计划,还是必须复制和粘贴查询并为输入参数创建绑定变量?
【问题讨论】:
标签: oracle
使用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 上给我答案的所有人,他们帮助我学习了如何做到这一点。
【讨论】:
据我了解,这是故意的。这个想法是优化器单独考虑过程中的各个查询,因此 EXPLAIN PLAN 对可能包含多个查询/语句的存储过程没有意义。
当前的答案是否定的,您不能针对 proc 运行它,您必须针对各个语句本身运行它。当你有变量和计算时会很棘手,但就是这样。
【讨论】:
当您执行解释计划时,许多工具(例如 Toad 或 SQL Developer)会提示您输入绑定变量值。您必须在 SQL*Plus 或其他工具中手动执行此操作。
您也可以开启 SQL 跟踪并执行存储过程,然后从跟踪文件中检索解释计划。
注意不要只检索 SELECT 语句的解释计划。 INSERT 子句的存在可以将优化器目标从第一行更改为所有行。
【讨论】: