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

在这里插入图片描述

💾 深入解析 Oracle 19C 的 V$WAITSTAT 视图

1. 视图概述与核心作用

V$WAITSTAT 是 Oracle 数据库中一个关键的性能诊断视图,它专门用于监控和报告缓冲区缓存(Buffer Cache)中各类块的等待统计信息。这个视图揭示了数据库进程在访问数据块时遇到的内部竞争情况。

  • 核心作用:提供关于缓冲区缓存中不同类型数据块等待的详细统计,帮助DBA识别和诊断与缓冲区访问相关的性能瓶颈。
  • 关键问题它回答
    • 数据库中存在哪些类型的块竞争?
    • 哪些块类型的等待最多?
    • 缓冲区缓存是否存在热点块或资源竞争?
    • 系统是否正在经历频繁的缓冲区忙等待?

该视图是诊断 buffer busy waitfree buffer wait 等关键等待事件的首要工具。

2. 核心字段详解

V$WAITSTAT 包含按块类别分类的等待统计信息,每个类别都记录了等待次数和时间。

字段名数据类型是否可为空描述
CLASSVARCHAR2(18)NO块类别名称。这是最重要的字段,标识了等待发生的块类型:
- data block:数据块
- sort block:排序块
- save undo block:保存回滚块
- segment header:段头块
- save undo header:保存回滚头块
- free list:空闲列表块
- extent map:区间映射块
- 1st level bmb:一级位图块
- 2nd level bmb:二级位图块
- 3rd level bmb:三级位图块
- bitmap block:位图块
- bitmap index block:位图索引块
- file header block:文件头块
- unused:未使用块
- system undo header:系统回滚头块
- system undo block:系统回滚块
- undo header:回滚头块
- undo block:回滚块
COUNTNUMBERNO自实例启动以来,此类块的等待总次数
TIMENUMBERNO自实例启动以来,此类块的总等待时间(厘秒)。1秒 = 100厘秒。

3. 工作原理与底层机制

3.1 缓冲区缓存竞争机制

Oracle 使用缓冲区缓存来管理数据块在内存中的存储。当多个进程试图同时访问同一个块或需要获取新的空闲缓冲区时,就会发生竞争:

  1. 缓冲区访问:进程需要访问特定数据块时,首先在缓冲区缓存中查找
  2. 缓冲区状态检查:如果找到块,检查其当前状态(是否正在被其他进程使用)
  3. 等待发生:如果块正在被使用(pin住),或需要获取空闲缓冲区但无可用缓冲区,进程进入等待状态
  4. 统计记录:等待事件被记录到相应的块类别计数中

3.2 V$WAITSTAT 的底层原理

V$WAITSTAT 的数据来源于 Oracle 内核中跟踪缓冲区访问竞争的内部计数器:

  1. 计数器更新:每当进程在访问缓冲区时遇到竞争需要等待,相应的块类别的计数器和时间累加器就会增加
  2. 内存结构:这些计数器存储在 SGA 的固定内存结构中,由 Oracle 内核维护
  3. X表映射∗∗:∗∗V表映射**:**V表映射VWAITSTAT 视图映射到底层的 **XKCBWDS∗∗等XKCBWDS** 等 XKCBWDSX 表,这些表存储了详细的等待统计信息
  4. 累积统计:与基于时间间隔的视图不同,V$WAITSTAT 提供的是自实例启动以来的累积值

3.3 关键等待类别解析

  • data block:最常见的数据块等待,通常表明热点块竞争
  • segment header:段头块竞争,通常与空间管理操作相关
  • undo header/undo block:回滚段竞争,常见于高DML并发环境
  • free list:空闲列表竞争(适用于手动段空间管理)

4. 主要应用场景

4.1 缓冲区竞争诊断

识别数据库中存在的缓冲区访问竞争问题。

-- 查看各类块的等待统计,按等待时间排序
SELECT class, count, time, 
       ROUND(time/NULLIF(count, 0), 2) AS avg_wait_ms
FROM v$waitstat 
ORDER BY time DESC;

4.2 热点块识别

识别可能存在热点块问题的对象。

-- 结合V$SESSION_WAIT查找当前正在等待的块信息
SELECT sw.sid, sw.p1, sw.p2, sw.p3, ws.class,
       sw.seconds_in_wait, sw.state
FROM v$session_wait sw, v$waitstat ws
WHERE sw.event = 'buffer busy waits'
AND sw.p2 = (SELECT MAX(p2) FROM v$session_wait 
             WHERE event = 'buffer busy waits')
AND ws.class = (SELECT class FROM v$waitstat 
                WHERE rownum = 1 ORDER BY time DESC);

4.3 性能基线比较

比较不同时间点的等待统计,评估性能变化。

-- 创建等待统计基线
CREATE TABLE waitstat_baseline AS
SELECT class, count, time, SYSDATE AS capture_time
FROM v$waitstat;

-- 比较当前与基线的差异
SELECT w.class, 
       w.count - b.count AS count_increase,
       w.time - b.time AS time_increase,
       ROUND((w.time - b.time) / NULLIF((w.count - b.count), 0), 2) AS avg_wait_ms
FROM v$waitstat w, waitstat_baseline b
WHERE w.class = b.class
ORDER BY time_increase DESC;

4.4 空间管理问题诊断

诊断与空间管理相关的等待问题。

-- 重点关注空间管理相关的等待
SELECT class, count, time,
       ROUND((time / SUM(time) OVER ()) * 100, 2) AS pct_total
FROM v$waitstat 
WHERE class IN ('segment header', 'free list', 'extent map',
               '1st level bmb', '2nd level bmb', '3rd level bmb')
ORDER BY time DESC;

5. 相关视图与关联查询

视图名称描述常用关联字段
V$SESSION_WAIT显示当前会话的等待信息。通过等待事件 buffer busy waits 关联。
V$BUFFER_POOL_STATISTICS缓冲区池统计信息。可关联分析缓冲区池的整体性能。
DBA_EXTENTS段扩展信息。通过文件号和块号关联到具体对象。
V$LATCH闩锁统计信息。缓冲区竞争常伴随闩锁竞争。
V$SYSTEM_EVENT系统级等待事件统计。查看 buffer busy waits 事件的总体情况。

常用综合查询:完整的缓冲区竞争分析

-- 综合缓冲区竞争分析报告
COLUMN class FORMAT A20
COLUMN total_waits FORMAT 999,999,999
COLUMN total_time_sec FORMAT 999,999.99
COLUMN avg_wait_ms FORMAT 999.99
COLUMN pct_total FORMAT 999.99

SELECT 
    class,
    count AS total_waits,
    ROUND(time / 100, 2) AS total_time_sec,
    ROUND(time / NULLIF(count, 0) * 10, 2) AS avg_wait_ms,
    ROUND((time / SUM(time) OVER ()) * 100, 2) AS pct_total
FROM 
    v$waitstat
WHERE 
    count > 0
ORDER BY 
    time DESC;

6. 关键知识点总结

  1. 累积统计V$WAITSTAT 提供的是自实例启动以来的累积值,要分析趋势需要定期采集快照进行比较。
  2. 缓冲区缓存焦点:此视图专门关注缓冲区缓存相关的等待,不包含其他类型的等待。
  3. 块级别诊断:通过分析不同块类别的等待,可以精确定位问题类型:
    • data block 等待:通常表示热点块
    • segment header 等待:空间管理问题
    • undo header/block 等待:回滚段竞争
  4. 与等待事件的关系V$WAITSTAT 的数据与 buffer busy waitsfree buffer waits 等等待事件直接相关。
  5. 调优指导
    • 高的 data block 等待:考虑优化SQL、增加初始化参数 db_cache_size、使用缓存表
    • 高的 segment header 等待:评估使用自动段空间管理(ASSM)
    • 高的 undo header/block 等待:增加回滚段数量或大小
  6. 重要比值:关注平均等待时间(TIME/COUNT),而不仅仅是总等待次数或时间。
  7. RAC 环境:在 RAC 环境中,缓冲区竞争可能表现为 gc buffer busy 等待,需要结合 GV$WAITSTAT 分析。

补充:定期监控脚本

-- 定期监控缓冲区等待趋势
SELECT 
    SYSDATE AS check_time,
    class,
    count,
    time,
    ROUND(time / NULLIF(count, 0) * 10, 2) AS avg_wait_ms
FROM v$waitstat 
WHERE class IN ('data block', 'segment header', 'undo header', 'undo block')
ORDER BY time DESC;

最佳实践建议

  1. 建立基线:在系统正常运行时采集 V$WAITSTAT 基线数据
  2. 定期监控:设置定期检查,特别关注增长迅速的等待类别
  3. 关联分析:将 VWAITSTAT∗∗数据与∗∗VWAITSTAT** 数据与 **VWAITSTAT数据与VSYSTEM_EVENT 中的相关等待事件结合分析
  4. 根本原因分析:识别高等待类别后,进一步诊断具体对象和SQL语句
  5. 预防性调优:在等待成为严重问题前实施调优措施

总之,V$WAITSTAT 是 Oracle 数据库性能诊断工具包中不可或缺的组件,它提供了缓冲区缓存竞争的详细视角,帮助DBA识别和解决与块访问相关的性能瓶颈。通过熟练掌握此视图,可以有效地优化数据库的内存访问性能,减少竞争等待,提高系统并发处理能力。

欢迎关注我的公众号《IT小Chen

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值