v $ session_longops TIMESTAMP字段和计时进程,以毫秒为单位

时间:2011-04-29 14:03:52

标签: oracle plsql timing

有谁知道TIMESTAMP中的v$session_longops字段是做什么的? documentation page上的说明只是说“时间戳”。

我需要获取我在longops中监视的某些操作的经过时间,并且测试它们通常不到1秒,但我仍然想知道哪些操作运行时间更长。我希望使用此TIMESTAMP字段来捕获毫秒时间,但我无法确定TIMESTAMP字段是否可用于此。

如果失败了,还有其他方法可以让我们在longops中获得这些进程的毫秒持续时间吗?

更新

进行了更多调查后,TIMESTAMP字段似乎始终具有NULL值。此外,它的数据类型是DATE,而不是TIMESTAMP ...

(使用Oracle 10g)

4 个答案:

答案 0 :(得分:1)

Oracle维护V$SESSION_LONGOPS - 您可以使用DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS将条目放入其中并进行更新,但Oracle会控制它们的清除方式。

有人想知道为什么你不创建自己的表来存储所有测试的时间,以便你可以随意分析所有数据?你似乎表明你有包含你的测试的包;与对INSERT的调用相比,向这些包中抛出UPDATEDBMS_APPLICATION_INFO语句似乎相当于零和。

V$SESSION_LONGOPS早于Oracle对TIMESTAMP数据类型的支持,因此该列为DATE的原因。

答案 1 :(得分:0)

你可以得到这样的毫秒数:

SYS@PRJ_SCOTTY1-VM> select to_char(SYSTIMESTAMP, 'hh24:mi:ss:ff3') from dual;

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

SYS@PRJ_SCOTTY1-VM> select to_char(SYSTIMESTAMP, 'hh24:mi:ss:ff3') from dual;

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

SYS@PRJ_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;

答案 2 :(得分:0)

也许你可以使用SELECT dbms_utility.get_time FROM dual;? 它以几百秒的速度返回时间,只需通过简单的减法计算经过的时间。

答案 3 :(得分: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');

是的,我将毫秒持续时间存储在上下文字段中,因为它似乎可用于开发人员需要的任何目的。