V$SESSION_EVENT - Oracle Wait Interface Memo

| 6 Comments

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时间信息特性 。内容很有参考价值。

6 Comments

您好,
请问为什么有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

关于本文

This page contains a single entry by Fenng published on December 29, 2004 3:12 PM.

When One Can Call Oneself EXPERT was the previous entry in this blog.

Scaling Oracle8i is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.