什么是 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 列也不足为奇了。