我有一个从我们的Java代码调用的PL / SQL函数。
我有执行PL / SQL函数的SQL_ID
,我可以访问我的只读数据库用户的V $视图。查询需要相当长的时间才能执行?有没有办法分析PL / SQL函数的执行情况,以检查执行的确切位置?
我知道如何对V$SQL
,V$ACTIVE_SESSION_HISTORY
和V$SESSION_LONGOPS
的SQL查询执行此操作,但我无法弄清楚如何为PL / SQL代码执行此操作。
PL / SQL函数需要4分钟才能执行,所以我可以在那段时间手动执行相当多的V $查询。我应该检查哪些V $视图在执行计划/功能中找到一行?这甚至可能吗?
答案 0 :(得分:0)
也许你可以使用DBMS_PROFILER来解决你的问题。但是,如果要使用此方法,则必须安装一些基础结构。 我不想描述如何安装" proftab.sql",this link shows how it works.
的过程它还显示了一些如何跟踪特定功能的快速示例。 我可以在一些测试后提供我的版本的分析查询:
select ppr.runid,
ppr.run_comment1,
decode(nvl(ppd.total_occur, 0), 0, 0, ppd.total_time / ppd.total_occur / 1000000) as Avg_msek,
ppd.total_time / 1000000 totaltime_msek,
ppd.total_occur,
uc.name,
uc.line,
uc.text as Source
from plsql_profiler_data ppd, plsql_profiler_units ppu, user_source uc, plsql_profiler_runs ppr
where ppd.runid = ppu.runid
and ppu.runid = ppr.runid
-- and ppr.run_comment1 = 'MYTEST' --show only a specific testrun
-- and ppr.runid = (select max(runid) from plsql_profiler_runs) /*to get the last run*/
and ppd.unit_number = ppu.unit_number
and ppu.unit_name = uc.name
and ppd.line#(+) = uc.line
and uc.type in ('PACKAGE BODY', 'TYPE BODY')
--order by uc.name, uc.line; --Show all code by line
--order by totaltime_msek desc; --Sort by slowest lines
order by total_occur desc, avg_msek desc --Sort by calls and slowest ones