
💾 深入解析 Oracle 19C 的 V$WAITSTAT 视图
1. 视图概述与核心作用
V$WAITSTAT 是 Oracle 数据库中一个关键的性能诊断视图,它专门用于监控和报告缓冲区缓存(Buffer Cache)中各类块的等待统计信息。这个视图揭示了数据库进程在访问数据块时遇到的内部竞争情况。
- 核心作用:提供关于缓冲区缓存中不同类型数据块等待的详细统计,帮助DBA识别和诊断与缓冲区访问相关的性能瓶颈。
- 关键问题它回答:
- 数据库中存在哪些类型的块竞争?
- 哪些块类型的等待最多?
- 缓冲区缓存是否存在热点块或资源竞争?
- 系统是否正在经历频繁的缓冲区忙等待?
该视图是诊断 buffer busy wait、free buffer wait 等关键等待事件的首要工具。
2. 核心字段详解
V$WAITSTAT 包含按块类别分类的等待统计信息,每个类别都记录了等待次数和时间。
| 字段名 | 数据类型 | 是否可为空 | 描述 |
|---|---|---|---|
| CLASS | VARCHAR2(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:回滚块 |
| COUNT | NUMBER | NO | 自实例启动以来,此类块的等待总次数。 |
| TIME | NUMBER | NO | 自实例启动以来,此类块的总等待时间(厘秒)。1秒 = 100厘秒。 |
3. 工作原理与底层机制
3.1 缓冲区缓存竞争机制
Oracle 使用缓冲区缓存来管理数据块在内存中的存储。当多个进程试图同时访问同一个块或需要获取新的空闲缓冲区时,就会发生竞争:
- 缓冲区访问:进程需要访问特定数据块时,首先在缓冲区缓存中查找
- 缓冲区状态检查:如果找到块,检查其当前状态(是否正在被其他进程使用)
- 等待发生:如果块正在被使用(pin住),或需要获取空闲缓冲区但无可用缓冲区,进程进入等待状态
- 统计记录:等待事件被记录到相应的块类别计数中
3.2 V$WAITSTAT 的底层原理
V$WAITSTAT 的数据来源于 Oracle 内核中跟踪缓冲区访问竞争的内部计数器:
- 计数器更新:每当进程在访问缓冲区时遇到竞争需要等待,相应的块类别的计数器和时间累加器就会增加
- 内存结构:这些计数器存储在 SGA 的固定内存结构中,由 Oracle 内核维护
- X表映射∗∗:∗∗V表映射**:**V表映射∗∗:∗∗VWAITSTAT 视图映射到底层的 **XKCBWDS∗∗等XKCBWDS** 等 XKCBWDS∗∗等X 表,这些表存储了详细的等待统计信息
- 累积统计:与基于时间间隔的视图不同,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. 关键知识点总结
- 累积统计:V$WAITSTAT 提供的是自实例启动以来的累积值,要分析趋势需要定期采集快照进行比较。
- 缓冲区缓存焦点:此视图专门关注缓冲区缓存相关的等待,不包含其他类型的等待。
- 块级别诊断:通过分析不同块类别的等待,可以精确定位问题类型:
data block等待:通常表示热点块segment header等待:空间管理问题undo header/block等待:回滚段竞争
- 与等待事件的关系:V$WAITSTAT 的数据与
buffer busy waits、free buffer waits等等待事件直接相关。 - 调优指导:
- 高的
data block等待:考虑优化SQL、增加初始化参数db_cache_size、使用缓存表 - 高的
segment header等待:评估使用自动段空间管理(ASSM) - 高的
undo header/block等待:增加回滚段数量或大小
- 高的
- 重要比值:关注平均等待时间(TIME/COUNT),而不仅仅是总等待次数或时间。
- 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;
最佳实践建议:
- 建立基线:在系统正常运行时采集 V$WAITSTAT 基线数据
- 定期监控:设置定期检查,特别关注增长迅速的等待类别
- 关联分析:将 VWAITSTAT∗∗数据与∗∗VWAITSTAT** 数据与 **VWAITSTAT∗∗数据与∗∗VSYSTEM_EVENT 中的相关等待事件结合分析
- 根本原因分析:识别高等待类别后,进一步诊断具体对象和SQL语句
- 预防性调优:在等待成为严重问题前实施调优措施
总之,V$WAITSTAT 是 Oracle 数据库性能诊断工具包中不可或缺的组件,它提供了缓冲区缓存竞争的详细视角,帮助DBA识别和解决与块访问相关的性能瓶颈。通过熟练掌握此视图,可以有效地优化数据库的内存访问性能,减少竞争等待,提高系统并发处理能力。
欢迎关注我的公众号《IT小Chen》
1039

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



