首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何可靠地获取查询的SQL_ID

问如何可靠地获取查询的SQL_ID
EN

Stack Overflow用户
提问于 2017-03-15 02:25:58
回答 1查看 37K关注 0票数 2

我知道这似乎是一个简单的问题--你可能会认为存在现有的答案。但是..。

理解我希望它在性能上是合理的,因此它允许对每个执行的查询(或者至少是大型查询)进行记录,而不需要太多开销。

我的第一个想法是这个查询:

代码语言:javascript
复制
select sid,serial#,prev_sql_id from v$session where audsid=userenv('sessionid');

我的想法是,如果我在目标查询之后立即运行这个程序,我将通过sql_id捕获正确的prev_sql_id。

但是..。我不是..。我得到了一个不同的SQL ..。显然,在我的目标SELECT语句和prev_sql_id查询之间,还运行了其他一些东西。在我的示例中,启用了审计,并捕获了插入到SYS.AUD$表中的内容。不是很好。

由于我这次尝试的主要目的是捕获查询的执行计划(因为它是由共享池执行和捕获的),所以我认为可以简单地运行这个查询:

代码语言:javascript
复制
SELECT *
  FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR());

文档声明,使用NULL SQL_ID作为参数,它将在最近的查询运行上运行解释计划。我希望这能解决以前的问题。但是..。我得到了完全相同的插入到SYS.AUD$表中的计划。

您可能会说,好的,然后只需在查询中添加一个可以轻松捕获SQL_ID的注释,如下所示:

代码语言:javascript
复制
SELECT /* SQL: 1234-12' */ FROM DUAL;

然后,我可以如下所示地找到SQL_ID:

代码语言:javascript
复制
SELECT * FROM V$SQLAREA WHERE sql_text like '%SQL: 1234-12%';

这将给出几个可能的候选项,其中还包括V$SQLAREA查询本身。这里的问题是,我需要随机化每一个查询运行,这将导致我总是有一个硬解析。

我曾尝试过其他的解决方案,我在历史中,但这需要付出更大的代价。我试图寻找其他的解决方案。他们似乎都在某种程度上落后了。

相关条款:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-27 19:30:21

你可以使用新的加选项

代码语言:javascript
复制
SET FEEDBACK ON SQL_ID;

SQL_ID为执行的SQL或PL/SQL语句返回sql_id。 sql_id将分配给预定义变量_SQL_ID。您可以使用这个预定义变量来调试已执行的SQL语句。该变量可以像任何其他预定义变量(如_USER和_DATE )一样使用。

代码语言:javascript
复制
SQL> SET FEEDBACK ON SQL_ID
SQL> SELECT * FROM DUAL;  

D 
- 
X  

1 row selected.  
SQL_ID: a5ks9fhw2v9s1 

--
SQL> SELECT sql_text FROM v$sql WHERE sql_id = '&_sql_id';  

SQL_TEXT 
----------------------------------------------------- 
SELECT * FROM DUAL  

1 row selected. 
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42800041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档