获取 SQL 执行计划。 PL/SQL Developer = 奇怪的行为。 SQL*Plus = 未选择任何行
Posted
技术标签:
【中文标题】获取 SQL 执行计划。 PL/SQL Developer = 奇怪的行为。 SQL*Plus = 未选择任何行【英文标题】:Fetching SQL execution plan. PL/SQL Developer = strange behaviour. SQL*Plus = no rows selected 【发布时间】:2014-12-04 11:23:57 【问题描述】:我在获取 SQL 计划时遇到问题。
在最终形式中,我必须通过 PL*SQL 获取它们。
所以我有一个 bash 脚本,一个循环遍历 sql 计划名称和参数,以及这样的代码:
sqlplus -s /nolog > /dev/null 2>&1 <<EOF
CONNECT BLAH/BLAH@BLAH
*CLEAR AND SET COMMANDS HERE*
VARIABLE RC REFCURSOR;
SPOOL $BERICHT_$configArray[0].DATA
SET TIMING ON;
EXEC :RC := $aktuellesBericht;
SET TIMING OFF;
PRINT RC;
DISCONNECT
QUIT
EOF
第二部分:(以 SYS 身份登录,但没有 SYSDBA 权限,我没有它们,我认为我不会拥有它们...)
sqlplus -s /nolog > /dev/null 2>&1 <<EOF
CONNECT SYSBLAH/SYSBLAH@BLAH
SPOOL $BERICHT_$configArray[0].SQLPLAN.TXT
CLEAR BREAK
CLEAR COMP
CLEAR COL
select
sqlplan.operation,
sqlplan.options,
sqlplan.object_name,
sqlplan.cost,
sqlplan.depth
from v\$sqlarea sqlarea,
v\$session sesion,
v\$sql_plan sqlplan
where sesion.sql_hash_value = sqlarea.hash_value
and sesion.sql_address = sqlarea.address
and sqlarea.plan_hash_value = sqlplan.plan_hash_value
and sesion.username = 'BLAH' order by sqlplan.depth;
QUIT
EOF
我能从中得到的只有 *.SQLPLAN.TXT
只包含一句话的文件:no rows selected
这里有什么奇怪的,当我在 PL/SQL Developer 中做同样的事情时 - 我得到了相同的结果,但是当我在两个 SQL 窗口上单击自动刷新计时器按钮时,两个查询并行运行,并且有时第二个查询(获取 SQL 计划的那个)会给我结果。有时它不会。
这些命令似乎需要并行运行......还是我遗漏了什么?
【问题讨论】:
可能不相关:但是你为什么使用这么复杂的SQL语句而不是dbms_xplan
?
@a_horse_with_no_name 我很乐意,但我找不到在 ORacle 包上使用它的方法。
dbms_xplan.display_cursor
将返回一个带有执行计划的 CLOB。返回值可以存储在变量中,例如:select dbms_xplan.display_cursor(...) into l_clob_variable from dual
@a_horse_with_no_name 我试过类似的东西,但我得到:User has no SELECT privilege on V$SESSION
。我可以访问 2 个帐户 - 从一个我可以使用参数运行包,EXEC :RC := SOMEPACKAGE.SOMEFUNCTION(Some,parameters,here);
,第二个是 SYS,我可以在其中使用 SQL 计划...管理员团队无法授予其他权限第一个帐户...
【参考方案1】:
从来不需要我的问题中的 sql 查询。
我只需要写信给管理团队,授予我SELECT
的权限:
V$SQL_PLAN
、V$SESSION
和 V$SQL_PLAN_STATISTICS_ALL
我的问题的答案找到了here。
我将来需要对这个问题有更深入的了解,但就目前而言,FWIK 更深入地研究了dbms_xplan
包给了我这个想法。
从 SYSACC 帐户获取查询的方法是错误的想法。这个 acc 可以访问所有查询历史记录,并且很难(如果可能的话)找出我需要的 sql 计划。
【讨论】:
以上是关于获取 SQL 执行计划。 PL/SQL Developer = 奇怪的行为。 SQL*Plus = 未选择任何行的主要内容,如果未能解决你的问题,请参考以下文章
PL/SQL:如何运行存储在表列中的sql语句来获取sql语句的执行时间?