面试宝典:介绍下Oracle数据库动态性能视图 V$SESSION_WAIT_CLASS

在这里插入图片描述

好的,我们来详细解析 Oracle 19c 数据库中的 V$SESSION_WAIT_CLASS 动态性能视图。

V$SESSION_WAIT_CLASS 视图提供了会话级别的等待事件类别汇总统计信息。它显示了每个会话在各个等待类别(Wait Class)上所花费的总时间、等待次数等累积数据。这对于快速定位某个特定会话或某类会话(如某个应用服务)的主要资源等待类型至关重要,是进行性能问题精确定位的高阶视角。

一、字段含义详解

字段名数据类型描述重要说明
SIDNUMBER会话标识符 (Session Identifier)。V$SESSION.SID 直接对应。
WAIT_CLASS_IDNUMBER等待类别的唯一数字标识符。此ID与 V$SYSTEM_WAIT_CLASS.WAIT_CLASS_ID 等视图中的相同,用于精确关联。
WAIT_CLASS#NUMBER等待类别的内部编号。通常与 WAIT_CLASS_ID 一致,但建议使用 WAIT_CLASS_ID 进行关联操作。
WAIT_CLASSVARCHAR2(64)等待类别的名称。这是最直观、最重要的字段。例如:'User I/O', 'Application', 'Concurrency', 'Commit', 'Network', 'Idle'
TOTAL_WAITSNUMBER该会话从启动开始,在此等待类别中发生的总等待次数此值为累计值,会话不结束或不被重置则会一直增长。
TIME_WAITEDNUMBER该会话在此等待类别中花费的总等待时间(单位:百分之一秒,即 10ms)。此值是衡量资源等待对会话性能影响的核心指标。TIME_WAITED / TOTAL_WAITS 可得到此类等待的平均单次等待时间。
TOTAL_WAITS_FGNUMBER该会话在作为前台会话时(即非后台进程),在此等待类别中发生的总等待次数。通常更关注前台用户会话的等待。
TIME_WAITED_FGNUMBER该会话在作为前台会话时,在此等待类别中花费的总等待时间(单位:百分之一秒)。对于用户会话的性能分析,此字段比 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)。

二、核心原理与底层机制

  1. 数据来源
    V$SESSION_WAIT_CLASS 是一个动态性能视图,其数据来源于 SGA 中的内存数据结构。每当会话完成一次等待事件,Oracle 内核不仅会更新该事件的详细记录(如 V$SESSION_EVENT),还会将其归类并累加到其所属的等待类别计数器上。这些计数器是与会话结构体绑定的。

  2. 底层基表 (X$ Tables)
    像所有 V$ 视图一样,V$SESSION_WAIT_CLASS 是基于更底层的 X$ 虚拟表构建的。虽然 X$ 表的结构是未公开的,但通常可以认为 V$SESSION_WAIT_CLASS 的信息来源于与会话状态相关的 X$ 结构(如 X$KSLWSC 或类似结构)。这些 X$ 表直接映射了 SGA 中用于跟踪等待统计信息的内存。

  3. 工作机理

    • 会话初始化时,为其每个等待类别的统计信息分配内存空间并清零。
    • 每当会话经历一个非空闲等待事件并结束时,Oracle 会:
      1. 确定该事件所属的等待类别。
      2. 将该会话对应等待类别的 TOTAL_WAITS 加 1。
      3. 将该事件的等待时间(如果计时统计开启)加到 TIME_WAITED 上。
      4. 根据会话类型(前台/后台),更新 TOTAL_WAITS_FGTIME_WAITED_FG
    • 查询 V$SESSION_WAIT_CLASS 视图实质上就是实时查询这些内存中的计数器。
  4. 与相关视图的关系

    • 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 示例

  1. 查看指定会话(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;
    
  2. 找出系统中当前等待时间最长的用户会话(按等待类别)

    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;
    
  3. 比较两个会话(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;
    
  4. 定位消耗 ‘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;
    

四、主要应用场景

  1. 会话级性能问题快速定位
    当一个应用会话报告性能缓慢时,DBA 可以查询该会话的 V$SESSION_WAIT_CLASS,快速判断瓶颈是 I/O (User I/O)、锁 (Application) 还是内部竞争 (Concurrency),从而确定下一步的深入调查方向。

  2. 应用模式分析
    比较不同功能模块或不同用户产生的会话的等待类别分布,可以了解不同应用逻辑对数据库资源的需求特性。例如,一个批处理作业可能主要等待 User I/O,而一个OLTP事务可能主要等待 CommitApplication

  3. 容量规划与资源优化
    如果发现系统中有大量会话在 Configuration 类别上花费了显著时间,可能预示着需要调整某些初始化参数(如扩大内存相关的参数以减少 latch 争用)。

  4. 联动分析
    首先通过 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值