v$session_event 记载了当前连接到数据库的所有会话的统计信息,从名字上也可以看出来,这是个会话级(Session Level)的动态视图。
继续以 Oracle Wait Interface: A Practical Guide to Performance Diagnostics & Tuning 这本书为参考,分析 OWI 。先看看v$session_event 的数据结构:
SQL> desc v$session_event Name Null? Type -------------------------------------- -------- -------------------------- SID NUMBER EVENT VARCHAR2(64) TOTAL_WAITS NUMBER TOTAL_TIMEOUTS NUMBER TIME_WAITED NUMBER AVERAGE_WAIT NUMBER MAX_WAIT NUMBER TIME_WAITED_MICRO NUMBER EVENT_ID NUMBER //10g's New Column SQL>
V$SESSION_EVENT 语句由 X$KSLES (Kernel Service Current Session statistics) 和 x$ksled(Kernel Service Latch Event Descriptors) 这两个固定表得来。(致谢:抽取脚本由 Rudolf 友情提供,下载
)
SELECT s.inst_id, s.kslessid, d.kslednam, s.ksleswts, s.kslestmo, ROUND (s.kslestim / 10000), ROUND (s.kslestim / (10000 * s.ksleswts)), ROUND (s.kslesmxt / 10000), s.kslestim, d.ksledha sh FROM x$ksles s, x$ksled d WHERE s.ksleswts != 0 AND s.kslesenm = d.indx;
v$session_event 结构中包含 SID ,要想获取其中的内容,可能需要首先获取 SID 信息。可以通过 v$session 视图来做到,也可以利用 DBMS_SUPPORT 包来获取 SID 。要注意:在 Oracle RDBMS 9.2.0.1 与 9.2.0.2 中,因为 Bug:2429929 的影响,V$SESSION_EVENT.SID 是错误的(需要在该值的基础上+1)。
常用的 SQL 举例:
SQL> col sid format 999 SQL> col event format a30 SQL> col username format a8 SQL> SELECT b.SID, 2 DECODE (b.username, 3 NULL, SUBSTR (b.program, 18), 4 b.username 5 ) username, 6 a.event, a.total_waits , a.time_waited , 7 a.average_wait, a.max_wait 8 FROM v$session_event a, v$session b 9 WHERE b.SID = a.SID and b.username='SCOTT' 10 ORDER BY 1, 4; SID USERNAME EVENT TOTAL_WAITS TIME_WAITED AVERAGE_WAIT MAX_WAIT ---- -------- ------------------------------ ----------- ----------- ------------ ---------- 217 SCOTT SQL*Net more data from client 2 0 0 0 217 SCOTT SQL*Net break/reset to client 2 0 0 0 217 SCOTT SQL*Net more data to client 11 0 0 0 217 SCOTT SQL*Net message from client 88 151790 1725 85964 217 SCOTT SQL*Net message to client 89 0 0 0 SQL>
v$session_event 中比较重要的列是 TIME_WAITED 与 MAX_WAIT 。MAX_WAIT 列记载了每个会话每个时间的最大等待时间。可以通过执行
execute dbms_system.kcfrms;
来重置该列信息。Ora-600 写了一篇 新的Oracle时间信息特性 。内容很有参考价值。
您好,
请问为什么有v$session_event sid 和 v$session 种关联不到的情况?比如我查v$session_event 有sid 13 但是v$session 中没有,v$session_wait中也没有。
您好,
为什么会出现v$session_event 中的sid 在v$session 中不存在的现象?(刚才发了一次,但是不知道为什么看不到。)
V$SESSION_EVENT.SID = V$SESSION.SID – 1
看看能取到不?不同的版本有Bug的
V$SESSION_EVENT.SID = V$SESSION.SID – 1 这样倒是可以取到关联不上的那条,但是其他的就不关联不上了。
真是什么bug都有啊,8i上好像没这个问题,9201却有。
好像是bug:3566136
实际v$process