如何获取PL / SQL函数的执行统计信息?

时间:2016-10-03 09:00:35

标签: java oracle plsql

我有一个从我们的Java代码调用的PL / SQL函数。

我有执行PL / SQL函数的SQL_ID,我可以访问我的只读数据库用户的V $视图。查询需要相当长的时间才能执行?有没有办法分析PL / SQL函数的执行情况,以检查执行的确切位置?

我知道如何对V$SQLV$ACTIVE_SESSION_HISTORYV$SESSION_LONGOPS的SQL查询执行此操作,但我无法弄清楚如何为PL / SQL代码执行此操作。

PL / SQL函数需要4分钟才能执行,所以我可以在那段时间手动执行相当多的V $查询。我应该检查哪些V $视图在执行计划/功能中找到一行?这甚至可能吗?

1 个答案:

答案 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