有谁知道TIMESTAMP
中的v$session_longops
字段是做什么的? documentation page上的说明只是说“时间戳”。
我需要获取我在longops中监视的某些操作的经过时间,并且短测试它们通常不到1秒,但我仍然想知道哪些操作运行时间更长。我希望使用此TIMESTAMP
字段来捕获毫秒时间,但我无法确定TIMESTAMP
字段是否可用于此。
如果失败了,还有其他方法可以让我们在longops中获得这些进程的毫秒持续时间吗?
更新
进行了更多调查后,TIMESTAMP
字段似乎始终具有NULL值。此外,它的数据类型是DATE
,而不是TIMESTAMP
...
(使用Oracle 10g)
答案 0 :(得分:1)
Oracle维护V$SESSION_LONGOPS
- 您可以使用DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS
将条目放入其中并进行更新,但Oracle会控制它们的清除方式。
有人想知道为什么你不创建自己的表来存储所有测试的时间,以便你可以随意分析所有数据?你似乎表明你有包含你的测试的包;与对INSERT
的调用相比,向这些包中抛出UPDATE
或DBMS_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');
是的,我将毫秒持续时间存储在上下文字段中,因为它似乎可用于开发人员需要的任何目的。