PLSQL - 测量过程的执行持续时间

Posted

技术标签:

【中文标题】PLSQL - 测量过程的执行持续时间【英文标题】:PLSQL - Measure the execution duration of a procedure 【发布时间】:2011-03-14 19:01:26 【问题描述】:

我有一个每隔一小时运行一次的程序来填充一个表。该过程处理的记录很多,因此每次执行大约需要12~17分钟。 您现在是否有办法(即触发器)记录每次执行的持续时间(即记录到表中)?

【问题讨论】:

【参考方案1】:

我不知道有什么触发器可以自动完成。一种方法是这样的

PROCEDURE MY_PROC IS
  tsStart  TIMESTAMP;
  tsEnd    TIMESTAMP;
BEGIN
  tsStart := SYSTIMESTAMP;

  -- 'real' code here

  tsEnd := SYSTIMESTAMP;

  INSERT INTO PROC_RUNTIMES (PROC_NAME, START_TIME, END_TIME)
    VALUES ('MY_PROC', tsStart, tsEnd);
END MY_PROC;

如果您只需要几个程序,这可能就足够了。

分享和享受。

【讨论】:

你也可以使用DBMS_UTILITY.GET_TIME @BobJarvis @Sathya:当然可以使用 DBMS_UTILITY.GET_TIME,但是 GET_TIME 的分辨率只有 1/100 秒。在有问题的函数运行几分钟的情况下,这可能会起作用,但在您有一个运行非常快的过程的情况下,TIMESTAMP 更适合记录开始和结束时间。当然,如果一个快速运行的过程正在计时,大量的记录将被插入到 PROC_RUNTIMES 中,这很可能会迅速填满相关的表空间。它总是一些东西...... :-)【参考方案2】:

我通常使用带有日期或时间戳列的日志表,该列使用默认值 sysdate/systimestamp。然后我调用一个自治程序,在我关心的某些地方(启动/结束程序调用、提交后等)插入日志:

见here(寻找我的答案)。

如果您要插入数百万行,您可以控制插入日志表的时间(频率)。再次,请参阅我的示例。

【讨论】:

【参考方案3】:

要添加到第一个答案,一旦有了开始和结束时间戳,就可以使用此函数将它们转换为毫秒数。如果没有别的,这有助于提高可读性。

function timestamp_diff(
  start_time_in timestamp,
  end_time_in timestamp) return number
as
  l_days number;
  l_hours number;
  l_minutes number;
  l_seconds number;
  l_milliseconds number;
begin
  select extract(day from end_time_in-start_time_in)
  , extract(hour from end_time_in-start_time_in)
  , extract(minute from end_time_in-start_time_in)
  , extract(second from end_time_in-start_time_in)
  into l_days, l_hours, l_minutes, l_seconds
  from dual;

 l_milliseconds := l_seconds*1000 + l_minutes*60*1000
   + l_hours*60*60*1000 + l_days*24*60*60*1000;

  return l_milliseconds;
end;

【讨论】:

以上是关于PLSQL - 测量过程的执行持续时间的主要内容,如果未能解决你的问题,请参考以下文章

如何持续测量 EF 性能?

在使用 K6 时测量 x 个请求的持续时间

测量plsql过程中sql语句的时间

精确的音调开始/持续时间测量?

如何测量 powershell 脚本中不同功能的持续时间(以秒为单位)?

fft Matlab 振动时域到频率测量持续时间 = 60 s