查找调用SQL_ID的PL/SQL包

我们有某个 SQL_ID 存在性能问题(例如 cd123812jedjdu)。这是从 PKG1 调用的 AWR 报告中显示的。但是,PKG1 内部调用了这么多包,如下所示:

PKG1.MAIN
-> PKG1.PROC1
-> -> PKG2.PROC1
-> -> PKG2.PROC2
-> -> PKG2.PROC3
-> PKG1.PROC2
-> -> PKG3.PROC1
-> -> PKG3.PROC2
-> -> PKG3.PROC3
-> PKG1.PROC3
-> -> PKG4.PROC1
-> -> PKG4.PROC2
-> -> PKG4.PROC3
-> PKG1.PROC4
-> -> PKG5.PROC1
-> -> PKG5.PROC2
-> -> PKG5.PROC3

经过数小时的跟踪,我发现它是从PKG4.PROC3. 无论如何我可以找到调用 SQL_ID 的实际 PL/SQL 包,也许是v$视图?

注意:我知道 SQL_TEXT 可以是来自v$视图的查询,但是有多个具有相同 SQL_TEXT 的类似查询。

回答

你不需要使用PL/Scope,你需要的信息v$sql在查询被硬解析的时候就已经存储在里面了(当然,如果同一个查询出现在多段代码中,只有被硬解析的那个) from 将出现,除非有足够的差异来触发额外的子游标)。

您关心的列program_id最多匹配dba_objects.object_id. 它还会告诉您 SQL 出现在program_line#.

这是一个快速的 LiveSQL 演示。这些列至少从 Oracle 10.2 开始就存在了。


以上是查找调用SQL_ID的PL/SQL包的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>