
好的,我们来详细解析 Oracle 19c 数据库中的 V$SESSION_WAIT_CLASS 动态性能视图。
V$SESSION_WAIT_CLASS 视图提供了会话级别的等待事件类别汇总统计信息。它显示了每个会话在各个等待类别(Wait Class)上所花费的总时间、等待次数等累积数据。这对于快速定位某个特定会话或某类会话(如某个应用服务)的主要资源等待类型至关重要,是进行性能问题精确定位的高阶视角。
一、字段含义详解
| 字段名 | 数据类型 | 描述 | 重要说明 |
|---|---|---|---|
| SID | NUMBER | 会话标识符 (Session Identifier)。 | 与 V$SESSION.SID 直接对应。 |
| WAIT_CLASS_ID | NUMBER | 等待类别的唯一数字标识符。 | 此ID与 V$SYSTEM_WAIT_CLASS.WAIT_CLASS_ID 等视图中的相同,用于精确关联。 |
| WAIT_CLASS# | NUMBER | 等待类别的内部编号。 | 通常与 WAIT_CLASS_ID 一致,但建议使用 WAIT_CLASS_ID 进行关联操作。 |
| WAIT_CLASS | VARCHAR2(64) | 等待类别的名称。这是最直观、最重要的字段。 | 例如:'User I/O', 'Application', 'Concurrency', 'Commit', 'Network', 'Idle'。 |
| TOTAL_WAITS | NUMBER | 该会话从启动开始,在此等待类别中发生的总等待次数。 | 此值为累计值,会话不结束或不被重置则会一直增长。 |
| TIME_WAITED | NUMBER | 该会话在此等待类别中花费的总等待时间(单位:百分之一秒,即 10ms)。 | 此值是衡量资源等待对会话性能影响的核心指标。TIME_WAITED / TOTAL_WAITS 可得到此类等待的平均单次等待时间。 |
| TOTAL_WAITS_FG | NUMBER | 该会话在作为前台会话时(即非后台进程),在此等待类别中发生的总等待次数。 | 通常更关注前台用户会话的等待。 |
| TIME_WAITED_FG | NUMBER | 该会话在作为前台会话时,在此等待类别中花费的总等待时间(单位:百分之一秒)。 | 对于用户会话的性能分析,此字段比 TIME_WAITED 更具针对性。 |
关键等待类别 (WAIT_CLASS) 解读:
- User I/O: 用户发出的 I/O 等待,如全表扫描、索引扫描 (
db file scattered/sequential read)。这是最常见的调优类别。 - Application: 由应用程序逻辑引起的等待,主要是行锁竞争 (
enq: TX - row lock contention)。 - Concurrency: 数据库内部并发资源的竞争,如缓冲区缓存块争用 (
buffer busy waits)、索引块争用等。 - Commit: 提交操作相关的等待,主要是
log file sync(等待 LGWR 将 redo 日志写入磁盘)。 - Configuration: 通常由不合理的配置或容量规划引起,如共享池/缓冲区缓存大小不足导致的 latch 争用。
- Network: 网络延迟或网络往返次数过多引起的等待。
- Idle: 空闲等待事件,表示会话在等待工作,通常不是性能问题的直接证据,分析时应过滤掉此类(如
SQL*Net message from client)。
二、核心原理与底层机制
-
数据来源:
V$SESSION_WAIT_CLASS是一个动态性能视图,其数据来源于 SGA 中的内存数据结构。每当会话完成一次等待事件,Oracle 内核不仅会更新该事件的详细记录(如V$SESSION_EVENT),还会将其归类并累加到其所属的等待类别计数器上。这些计数器是与会话结构体绑定的。 -
底层基表 (X$ Tables):
像所有V$视图一样,V$SESSION_WAIT_CLASS是基于更底层的 X$ 虚拟表构建的。虽然 X$ 表的结构是未公开的,但通常可以认为V$SESSION_WAIT_CLASS的信息来源于与会话状态相关的 X$ 结构(如X$KSLWSC或类似结构)。这些 X$ 表直接映射了 SGA 中用于跟踪等待统计信息的内存。 -
工作机理:
- 会话初始化时,为其每个等待类别的统计信息分配内存空间并清零。
- 每当会话经历一个非空闲等待事件并结束时,Oracle 会:
- 确定该事件所属的等待类别。
- 将该会话对应等待类别的
TOTAL_WAITS加 1。 - 将该事件的等待时间(如果计时统计开启)加到
TIME_WAITED上。 - 根据会话类型(前台/后台),更新
TOTAL_WAITS_FG和TIME_WAITED_FG。
- 查询
V$SESSION_WAIT_CLASS视图实质上就是实时查询这些内存中的计数器。
-
与相关视图的关系:
V$SESSION_EVENT: 提供会话级的详细等待事件统计。V$SESSION_WAIT_CLASS是其数据的按类别聚合(Group By)后的结果。V$SYSTEM_WAIT_CLASS: 提供整个实例自启动以来各个等待类别的全局汇总统计。V$SESSION_WAIT_CLASS是其数据的按会话分解。V$SESSION: 包含会话的完整信息。V$SESSION_WAIT_CLASS可以看作是对V$SESSION中等待信息的分类汇总和扩展。
三、常用查询 SQL 示例
-
查看指定会话(SID=123)的主要等待类型
SELECT sid, wait_class, total_waits, time_waited, ROUND(time_waited / NULLIF(total_waits, 0), 2) AS avg_wait_ms FROM v$session_wait_class WHERE sid = 123 AND wait_class != 'Idle' -- 过滤掉空闲等待 ORDER BY time_waited DESC; -
找出系统中当前等待时间最长的用户会话(按等待类别)
SELECT s.sid, s.username, s.program, s.status, swc.wait_class, swc.total_waits, swc.time_waited, ROUND(swc.time_waited / NULLIF(swc.total_waits, 0), 2) avg_wait_ms FROM v$session_wait_class swc JOIN v$session s ON swc.sid = s.sid WHERE s.type = 'USER' -- 只查用户会话 AND s.status = 'ACTIVE' -- 只查活跃会话 AND swc.wait_class != 'Idle' -- 过滤空闲等待 AND swc.time_waited > 0 -- 有等待时间的 ORDER BY swc.time_waited DESC; -
比较两个会话(SID 100 和 200)的等待模式差异
SELECT DECODE(GROUPING_ID(wc.wait_class), 1, 'TOTAL', wc.wait_class) AS wait_class, SUM(DECODE(wc.sid, 100, wc.time_waited, 0)) AS sid_100_time, SUM(DECODE(wc.sid, 200, wc.time_waited, 0)) AS sid_200_time, ROUND( RATIO_TO_REPORT(SUM(DECODE(wc.sid, 100, wc.time_waited, 0))) OVER() * 100, 2) AS sid_100_pct, ROUND( RATIO_TO_REPORT(SUM(DECODE(wc.sid, 200, wc.time_waited, 0))) OVER() * 100, 2) AS sid_200_pct FROM v$session_wait_class wc WHERE wc.sid IN (100, 200) AND wc.wait_class != 'Idle' GROUP BY ROLLUP(wc.wait_class) ORDER BY sid_100_time DESC NULLS LAST; -
定位消耗 ‘Concurrency’ 资源最多的会话
SELECT swc.sid, s.username, s.osuser, s.machine, s.program, s.sql_id, swc.total_waits, swc.time_waited FROM v$session_wait_class swc JOIN v$session s ON swc.sid = s.sid WHERE swc.wait_class = 'Concurrency' AND s.type = 'USER' ORDER BY swc.time_waited DESC;
四、主要应用场景
-
会话级性能问题快速定位:
当一个应用会话报告性能缓慢时,DBA 可以查询该会话的V$SESSION_WAIT_CLASS,快速判断瓶颈是 I/O (User I/O)、锁 (Application) 还是内部竞争 (Concurrency),从而确定下一步的深入调查方向。 -
应用模式分析:
比较不同功能模块或不同用户产生的会话的等待类别分布,可以了解不同应用逻辑对数据库资源的需求特性。例如,一个批处理作业可能主要等待User I/O,而一个OLTP事务可能主要等待Commit或Application。 -
容量规划与资源优化:
如果发现系统中有大量会话在Configuration类别上花费了显著时间,可能预示着需要调整某些初始化参数(如扩大内存相关的参数以减少 latch 争用)。 -
联动分析:
首先通过V$SYSTEM_WAIT_CLASS找到系统级的主要等待类别,然后使用V$SESSION_WAIT_CLASS钻取(Drill Down)到是哪些具体的会话造成了这些等待。
五、相关视图
V$SESSION: 会话基本信息。V$SESSION_EVENT: 会话级别的详细等待事件统计。V$SYSTEM_WAIT_CLASS: 系统级别的等待类别汇总。V$SYSTEM_EVENT: 系统级别的详细等待事件汇总。V$EVENT_NAME: 等待事件元数据字典,包含了事件到类别的映射关系。
总结来说,V$SESSION_WAIT_CLASS 是 Oracle 性能诊断体系中承上启下的关键视图,它将纷繁复杂的等待事件归纳为有意义的类别,极大地提高了DBA分析问题的效率。
欢迎关注我的公众号《IT小Chen》

1086

被折叠的 条评论
为什么被折叠?



