获取 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_PLANV$SESSIONV$SQL_PLAN_STATISTICS_ALL

我的问题的答案找到了here。

我将来需要对这个问题有更深入的了解,但就目前而言,FWIK 更深入地研究了dbms_xplan 包给了我这个想法。

从 SYSACC 帐户获取查询的方法是错误的想法。这个 acc 可以访问所有查询历史记录,并且很难(如果可能的话)找出我需要的 sql 计划。

【讨论】:

以上是关于获取 SQL 执行计划。 PL/SQL Developer = 奇怪的行为。 SQL*Plus = 未选择任何行的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL DEVELOPER执行计划的查看

PL/SQL 语句的 SQL 查询不起作用

PL/SQL:如何运行存储在表列中的sql语句来获取sql语句的执行时间?

oracle怎样查询数据库函数是不是被执行

pl/sql连接Oracle不管执行啥语句都会重复执行这条语句,永不停止,怎么办呀

PL/SQL 在 for 循环中执行即时异常处理