PLSQL - 测量存储过程的执行时间

4

我有一个每小时运行一次的过程,用于填充一个表格。由该过程处理的记录很多,因此每次执行大约需要12~17分钟。 您是否知道是否有一种方法(例如触发器)可以记录每次执行的持续时间(即记录到表格中)?

3个回答

7

我不知道是否有触发器可以自动完成这个任务。一种方法是:

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 - Sathyajith Bhat
1
@Sathya:当然可以使用DBMS_UTILITY.GET_TIME,但GET_TIME的分辨率只有1/100秒。这在函数运行多分钟的情况下可能有效,但在运行非常快的过程中,时间戳更适合记录开始和结束时间。当然,如果正在计时一个快速运行的过程,将插入大量记录到PROC_RUNTIMES中,这很可能会迅速填满相关表空间。总是有些问题... :-) - Bob Jarvis - Слава Україні

1

我通常使用带有日期或时间戳列的日志表,其默认值为sysdate / systimestamp。然后,我调用一个自主过程,在我关心的某些地方(开始/结束过程调用,提交后等)进行日志插入:

请参见这里(查找我的回答)。

如果您要插入数百万行,则可以控制何时(多久)将其插入日志表。再次,请参见我的示例。


1

除了第一个答案,一旦你有开始和结束时间戳,你可以使用此函数将它们转换为毫秒数。这有助于可读性,如果没有其他作用。

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接