说明存储过程中的查询计划
时间:2020-03-06 14:36:57 来源:igfitidea点击:
我有一个存储过程,该存储过程由一个选择查询组成,该查询用于根据对过程中的参数所做的一些次要数学插入到另一个表中。是否可以通过某种方式引用该过程来生成用于此查询的计划,还是必须复制并粘贴查询并为输入参数创建绑定变量?
解决方案
据我了解,这是有目的的。这个想法是,优化器会单独考虑过程中的各个查询,因此EXPLAIN PLAN对于可能包含多个查询/语句的存储过程没有意义。
当前答案为"否",我们不能针对proc运行它,而必须针对单个语句本身运行它。拥有变量和计算时比较棘手,但事实就是这样。
执行解释计划时,许多工具(例如Toad或者SQL Developer)会提示我们输入绑定变量值。我们将必须在SQL * Plus或者其他工具中手动执行此操作。
我们还可以打开SQL跟踪并执行存储过程,然后从跟踪文件中检索解释计划。
请注意,我们不只是检索SELECT语句的解释计划。 INSERT子句的存在可以将优化器目标从第一行更改为所有行。
使用SQL跟踪和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语句的计划。
编辑:出于全面披露的目的,我应该感谢上周在此主题上给我答案的所有人,这些答案帮助我学习了如何执行此操作。