Oracle Wait Interface: V$EVENT_NAME

什么是 OWI (Oracle Wait Interface)? 在 Oracle Wait Interface: A Practical Guide to Performance Diagnostics & Tuning 这本书中是这么定义的:

Oracle Wait Interface is a collection of a few dynamic performance views and an extended SQL trace file.



这本书几乎覆盖了 OWI 的所有内容。是一本不错的Oracle数据库性能调整参考书。

从 7.0.12 版本开始,Oracle就有如下几个 OWI 视图:

  • V$EVENT_NAME
  • V$SESSION_WAIT
  • V$SESSION_EVENT
  • V$SYSTEM_EVENT

先分析一下这个 V$EVENT_NAME,看看在 10g 中有什么变化:

SQL> desc v$event_name;
Name                       Null?    Type
-------------------------- -------- ------------------
EVENT#                              NUMBER
NAME                                VARCHAR2(64)
PARAMETER1                          VARCHAR2(64)
PARAMETER2                          VARCHAR2(64)
PARAMETER3                          VARCHAR2(64)

10g中新增了几列(注意字体加重的字段):

SQL> desc v$event_name
Name                       Null?    Type
-------------------------- -------- ------------------
EVENT#                              NUMBER
EVENT_ID                            NUMBER
NAME                                VARCHAR2(64)
PARAMETER1                          VARCHAR2(64)
PARAMETER2                          VARCHAR2(64)
PARAMETER3                          VARCHAR2(64)
WAIT_CLASS_ID                       NUMBER
WAIT_CLASS#                         NUMBER
WAIT_CLASS                          VARCHAR2(64)

其中,PARAMETER1、PARAMETER2
PARAMETER3 对应 V$SESSION_WAIT 中的 P1、P2、P3,这是非常重要的几列。

基本用法:

SQL> SELECT   wait_class#, wait_class_id, wait_class
2      FROM v$event_name
3  GROUP BY wait_class#, wait_class_id, wait_class;
WAIT_CLASS# WAIT_CLASS_ID WAIT_CLASS
----------- ------------- ------------------------------
0    1893977003 Other
1    4217450380 Application
2    3290255840 Configuration
3    4166625743 Administrative
4    3875070507 Concurrency
5    3386400367 Commit
6    2723168908 Idle
7    2000153315 Network
8    1740759767 User I/O
9    4108307767 System I/O
10    2396326234 Scheduler
11    3871361733 Cluster
12 rows selected.

与 v$system_event 视图联合使用:

SQL> SELECT   n.wait_class, SUM (e.time_waited) / 1000000 time_waited
2      FROM v$event_name n, v$system_event e
3     WHERE n.NAME = e.event
4  GROUP BY n.wait_class;
WAIT_CLASS                     TIME_WAITED
------------------------------ -----------
Application                              0
Commit                             .000024
Concurrency                        .000022
Configuration                      .000015
Idle                              3.669178
Network                                  0
Other                              .002454
System I/O                         .000393
User I/O                           .004079
9 rows selected.

v$event_name 从 X$ 表 X$ksled(Kernel Service Latch Event Descriptors) 而来(感谢 Rudolf Lu 友情提供的方便而实用的脚本!),创建语句类似如下:

SELECT inst_id, indx, ksledhash, kslednam, ksledp1, ksledp2, ksledp3,
ksledclassid, ksledclass#, ksledclass
FROM x$ksled;

对应的列:

MEANINGFUL NAME              X$ TABLE COLUMN NAME
=====================        ======================
event#                        indx
event_id                      ksledhash
name                          kslednam
parameter1                    ksledp1
parameter2                    ksledp2
parameter3                    ksledp3
wait_class_id                 ksledclassid
wait_class#                   ksledclass#
wait_class                    ksledclass

而 V$SESSION_WAIT 视图是基于 x$ksusecst 、x$ksled这两个固定表的,所以上文中提到的 v$event_name 的 PARAMETER1、PARAMETER2
PARAMETER3 对应 V$SESSION_WAIT 中的 P1、P2、P3 列也不足为奇了。


Leave a Reply

Your email address will not be published. Required fields are marked *