2011-04-29 76 views
1

有沒有人知道v$session_longops中的TIMESTAMP字段是幹什麼的?關於documentation page的描述只是說「時間戳」。

我需要得到我在longops中監視的一些操作和的測試時間,它們通常少於1秒,但我仍然想知道哪些運行時間更長。我希望能夠使用這個TIMESTAMP字段捕獲毫秒時間,但我無法確定TIMESTAMP字段是否可以用於此目的。

失敗了,有沒有其他方法可以在longops中獲得這些進程的毫秒持續時間?

UPDATE:

已經做了一些更多的調查,TIMESTAMP領域似乎總是有NULL值。此外,它的數據類型是DATE,不是TIMESTAMP ...

(使用Oracle 10g)

+0

它被稱爲v $ session_longops,因爲它的目的是監視長操作:-)您可以在操作前後捕獲systimestamp並計算差異,並且應該使您的精度達到6位小數。 – 2011-04-29 20:49:55

+0

@Martin Schapendonk:是的,那就是我最終做的。對於大型數據集(更接近「真正」大小的數據集),這些操作*需要足夠長的時間才能正常註冊。它適用於非常小的特定測試,它們運行速度太快,不易監控。 – FrustratedWithFormsDesigner 2011-04-29 21:05:55

回答

0

實際的解決方案最終看上去像這樣:

io_start := systimestamp; 
/*do some work*/ 
io_end := systimestamp; 
dbms_application_info.set_session_longops(rindex => io_rindex, slno => io_slno, target => 0, 
         context => extract(second from (io_end-io_start)), --for very short jobs, store the millisecond time difference in the Context field. 
         op_name => in_op_name, sofar => 1, totalwork => 1, 
         units => 'blocks', target_desc => 'block job'); 

是的,我存儲在上下文領域的毫秒時間,因爲它似乎是可用於任何目的的開發需求。

0

你可以得到毫秒這樣的:如果

[email protected]_SCOTTY1-VM> select to_char(SYSTIMESTAMP, 'hh24:mi:ss:ff3') from dual; 

TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS:FF3') 
------------------------------------------------------ 
16:06:10:944 

[email protected]_SCOTTY1-VM> select to_char(SYSTIMESTAMP, 'hh24:mi:ss:ff3') from dual; 

TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS:FF3') 
------------------------------------------------------ 
16:06:12:241 

[email protected]_SCOTTY1-VM> 

你需要的數字表示INTERVAL對象可以使用這些函數:

/* 
    ** ************************************************************************** 
    */ 
    Function daysBetween 
    (ts1 timestamp with time zone, 
    ts2 timestamp with time zone, 
    numDec number default 0 
    ) 
    Return Number is 
    i INTERVAL DAY(3) TO SECOND(3) := ts2 - ts1; 
    Begin 
    return round(
     +  extract(day from i) 
     +  extract(hour from i)/60 
     +  extract(minute from i)/60/60 
     +  extract(second from i)/60/60/60 
    , numDec); 
    End; 

    /* 
    ** ************************************************************************** 
    */ 
    Function hoursBetween 
    (ts1 timestamp with time zone, 
    ts2 timestamp with time zone, 
    numDec number default 0 
    ) 
    Return Number is 
    i INTERVAL DAY(3) TO SECOND(3) := ts2 - ts1; 
    Begin 
    return round(
     +  extract(day from i)*24 
     +  extract(hour from i) 
     +  extract(minute from i)/60 
     +  extract(second from i)/60/60 
    , numDec); 
    End; 

    /* 
    ** ************************************************************************** 
    */ 
    Function minutesBetween 
    (ts1 timestamp with time zone, 
    ts2 timestamp with time zone, 
    numDec number default 0 
    ) 
    Return Number is 
    i INTERVAL DAY(3) TO SECOND(3) := ts2 - ts1; 
    Begin 
    return round(
     +  extract(day from i)*24*60 
     +  extract(hour from i)*60 
     +  extract(minute from i) 
     +  extract(second from i)/60 
    , numDec); 
    End; 


    /* 
    ** ************************************************************************** 
    */ 
    Function secondsBetween 
    (ts1 timestamp with time zone, 
    ts2 timestamp with time zone, 
    numDec number default 0 
    ) 
    Return Number is 
    i INTERVAL DAY(3) TO SECOND(3) := ts2 - ts1; 
    Begin 
    return round(
     +  extract(day from i)*24*60*60 
     +  extract(hour from i)*60*60 
     +  extract(minute from i)*60 
     +  extract(second from i) 
    , numDec); 
    End; 


    /* 
    ** ************************************************************************** 
    */ 
    Function msecBetween 
    (ts1 timestamp with time zone, 
    ts2 timestamp with time zone, 
    numDec number default 0 
    ) 
    Return Number is 
    i INTERVAL DAY(3) TO SECOND(3) := ts2 - ts1; 
    Begin 
    return round (
     +  extract(day from i)*24*60*60*1000 
     +  extract(hour from i)*60*60*1000 
     +  extract(minute from i)*60*1000 
     +  extract(second from i)*1000 
    , numDec); 
    End; 
+0

我不確定這隻能在查詢'v $ session_longops'時完成 - 我希望只是增加我已有的監視查詢。我想我可以在我正在監視的主包中執行這些計算,然後通過'set_session_longops'將數據插入'C​​ONTEXT'字段中,因爲我沒有將它用於其他任何東西... – FrustratedWithFormsDesigner 2011-04-29 14:58:07

1

Oracle維護V$SESSION_LONGOPS - 可以使用DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS將條目放入並更新它們,但Oracle控制它們如何清除。

有人想知道爲什麼不創建自己的表來存儲所有測試的計時,以便您可以在閒暇時分析所有數據?你似乎表示你已經有了包含你的測試的軟件包;將INSERTUPDATE聲明投入到這些包中,與調用DBMS_APPLICATION_INFO相比,這似乎相當零和。

V$SESSION_LONGOPS早於Oracle對TIMESTAMP數據類型的支持,所以這就是爲什麼該列是DATE

+0

我使用'v $ session_longops '因爲它和支持方法('set_session_longops')已經存在並且做了我想要的 - 爲什麼當我需要和想要的東西已經存在時,添加新的表和方法?只是現在我想要毫秒的時間,我無法從'v $ session_longops'中獲得。在這個階段,可能沒有時間添加新的表格和包來維護它們。如果我現在知道我現在知道的東西......但是,還有什麼想法,'TIMESTAMP'列應該用於什麼?是否需要Oracle內部使用? – FrustratedWithFormsDesigner 2011-04-29 15:26:19

0

也許你可以使用SELECT dbms_utility.get_time FROM dual;? 它以幾百秒爲單位返回時間,計算一個已用時間就是一個簡單的減法。

相關問題