2011-03-14 54 views
4

我有一個程序每隔一個小時運行一個表。從程序處理的記錄很多,因此每次執行時大約需要12〜17分鐘。 現在,如果有一種方法(即觸發器)記錄每次執行的持續時間(即表格)?PLSQL - 測量過程的執行持續時間

回答

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; 

如果你只需要這幾個程序,這可能就足夠了。

分享和享受。

+0

你可以使用'DBMS_UTILITY.GET_TIME'以及右@BobJarvis – Sathya 2011-03-15 15:19:21

+1

@Sathya:肯定DBMS_UTILITY.GET_TIME可以使用,但GET_TIME的分辨率只有1/100秒。在這種情況下,這可能適用於所討論的函數運行多分鐘的情況,但是如果您的程序運行速度非常快,TIMESTAMP將更適合於記錄開始和結束時間。當然,如果一個快速運行的過程正在計時,大量的記錄將被插入到PROC_RUNTIMES中,這很可能會快速填充關聯的表空間。總是這樣...... :-) – 2011-03-15 15:32:26

+0

確實,謝謝澄清! – Sathya 2011-03-15 15:41:15

1

我通常使用帶日期或時間戳列的日誌表,該列使用sysdate/systimestamp的默認值。然後我調用一個自治過程,在日誌中插入我關心的某些地方(開始/結束過程調用,提交後等):

請參閱here(查找我的答案)。

如果要插入數百萬行,則可以控制何時(多久)插入日誌表。再次看到我的例子。

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;