
⏱️ 深入解析 Oracle 19C 的 V$WAITCLASSMETRIC 视图
1. 视图概述与核心作用
V$WAITCLASSMETRIC 是 Oracle 数据库性能诊断和调优的关键动态性能视图之一。它提供了基于等待类别的性能指标的快照信息,这些指标按时间间隔聚合,帮助DBA快速识别数据库中的性能瓶颈类别。
- 核心作用:以等待类别(Wait Class)为维度,展示数据库在每个60秒时间间隔内的等待时间和等待次数统计,用于快速定位系统级性能问题。
- 关键问题它回答:
- 数据库在过去几分钟内最主要的等待类型是什么?
- 哪些等待类别消耗了最多的数据库时间?
- 系统性能瓶颈的总体趋势如何?
- 等待事件的分布情况怎样?
该视图是 Oracle 自动工作负载仓库(AWR)和自动数据库诊断监视器(ADDM)性能分析的基础数据来源之一。
2. 核心字段详解
以下是 V$WAITCLASSMETRIC 视图中的关键字段,这些字段提供了按等待类别分组的性能指标。
| 字段名 | 数据类型 | 是否可为空 | 描述 |
|---|---|---|---|
| WAIT_CLASS_ID | NUMBER | NO | 等待类别的内部标识符。Oracle 内部使用的数字ID,唯一标识一个等待类别。 |
| WAIT_CLASS# | NUMBER | NO | 等待类别的编号。与 V$SYSTEM_WAIT_CLASS 中的等待类别编号对应。 |
| WAIT_CLASS | VARCHAR2(64) | NO | 等待类别名称。这是最重要的分类字段,常见值包括: - User I/O:用户I/O等待- System I/O:系统I/O等待- Concurrency:并发等待- Commit:提交等待- Network:网络等待- Application:应用程序等待- Configuration:配置相关等待- Administrative:管理任务等待- Cluster:RAC集群等待- Other:其他等待 |
| TIME_WAITED | NUMBER | NO | 在该时间间隔内,此类等待的总等待时间(厘秒)。1秒 = 100厘秒。这是衡量等待严重程度的关键指标。 |
| WAIT_COUNT | NUMBER | NO | 在该时间间隔内,此类等待的发生次数。结合 TIME_WAITED 可以计算平均等待时间。 |
| AVERAGE_WAITER_COUNT | NUMBER | YES | 在该时间间隔内,平均同时等待的会话数。 |
| DBTIME | NUMBER | YES | 数据库时间(Database Time)。该时间间隔内的总数据库时间消耗。 |
| GROUP_ID | NUMBER | NO | 指标组标识符。用于内部管理。 |
| INST_ID | NUMBER | NO | (在 RAC 环境中)实例标识符。生成该指标的实例ID。 |
| BEGIN_TIME | DATE | NO | 时间间隔的开始时间。指标收集的开始时间戳。 |
| END_TIME | DATE | NO | 时间间隔的结束时间。指标收集的结束时间戳。 |
3. 工作原理与底层机制
3.1 Oracle 等待事件体系简介
Oracle 使用等待事件(Wait Events)来标识和测量数据库操作中的各种等待情况。这些等待事件被分类到不同的等待类别中,以便于更高层次的性能分析。
3.2 V$WAITCLASSMETRIC 的底层原理
V$WAITCLASSMETRIC 视图的数据来源于 Oracle 性能监控基础设施:
- 数据收集:Oracle 内核持续跟踪所有会话的等待事件,当会话结束等待时,等待时间和次数会被记录到内存中的性能数据结构。
- 时间间隔聚合:Oracle 按固定时间间隔(默认为60秒)聚合这些等待统计信息。在每个间隔结束时,系统会计算该间隔内每个等待类别的总等待时间和等待次数。
- 循环缓冲区:聚合后的指标数据存储在 SGA 的循环缓冲区中。V$WAITCLASSMETRIC 视图提供了对这些缓冲区的访问。
- 数据保留:该视图通常保留最近11个时间间隔的数据(约11分钟),提供近实时的性能快照。
- AWR 集成:这些指标也会被自动工作负载仓库(AWR)捕获,用于长期性能趋势分析(存储在 DBA_HIST_WAITCLASSMETRIC 中)。
3.3 等待类别的重要性
将单个等待事件聚合到等待类别级别有以下优势:
- 简化分析:不需要分析数百个单独的等待事件
- 快速定位:快速识别问题的大致方向(是I/O问题、并发问题还是网络问题)
- 趋势分析:更容易观察性能瓶颈的趋势变化
4. 主要应用场景
4.1 实时性能监控
快速查看当前数据库的性能状况,识别主要的等待类别。
-- 查看最近一个时间间隔内的等待类别统计
SELECT wait_class,
ROUND(time_waited/100, 2) AS time_waited_seconds,
wait_count,
ROUND(time_waited/NULLIF(wait_count, 0), 2) AS avg_wait_ms
FROM v$waitclassmetric
ORDER BY time_waited DESC;
4.2 性能瓶颈诊断
当用户报告性能问题时,快速确定主要的等待类别。
-- 诊断当前性能问题的主要等待类别
SELECT wait_class,
ROUND(time_waited/100, 2) AS time_waited_seconds,
wait_count,
ROUND((time_waited / SUM(time_waited) OVER ()) * 100, 2) AS pct_total
FROM v$waitclassmetric
WHERE wait_class != 'Idle' -- 排除空闲等待
ORDER BY time_waited DESC;
4.3 性能趋势分析
分析多个时间间隔的数据,观察性能趋势。
-- 分析过去几个时间间隔的性能趋势
SELECT TO_CHAR(begin_time, 'HH24:MI:SS') AS begin_time,
wait_class,
ROUND(time_waited/100, 2) AS time_waited_seconds
FROM v$waitclassmetric
WHERE wait_class IN ('User I/O', 'System I/O', 'Concurrency')
ORDER BY begin_time, time_waited DESC;
4.4 容量规划和资源优化
识别需要额外资源投入的领域。
-- 识别需要资源优化的等待类别
SELECT wait_class,
SUM(time_waited) AS total_time_waited,
SUM(wait_count) AS total_waits,
ROUND(SUM(time_waited) / SUM(wait_count), 2) AS avg_wait_per_event
FROM v$waitclassmetric
WHERE wait_class != 'Idle'
GROUP BY wait_class
ORDER BY total_time_waited DESC;
5. 相关视图与关联查询
| 视图名称 | 描述 | 常用关联字段 |
|---|---|---|
| V$SYSMETRIC | 系统级性能指标,包含更广泛的性能数据。 | 可通过时间间隔进行关联分析。 |
| V$EVENTMETRIC | 更细粒度的事件级指标,显示单个等待事件的指标。 | V$WAITCLASSMETRIC.WAIT_CLASS_ID 可关联到事件的等待类别。 |
| V$SYSTEM_WAIT_CLASS | 系统级别的等待类别统计(自实例启动以来)。 | V$WAITCLASSMETRIC.WAIT_CLASS# = V$SYSTEM_WAIT_CLASS.WAIT_CLASS# |
| DBA_HIST_WAITCLASSMETRIC | AWR 历史等待类别指标,用于长期趋势分析。 | 相同的数据结构,但用于历史数据。 |
| V$WAITCLASSMETRIC_HISTORY | 显示更多历史时间间隔的等待类别指标。 | 与 V$WAITCLASSMETRIC 结构相同,但包含更多时间间隔。 |
常用综合查询:完整的性能分析报告
-- 生成详细的等待类别性能报告
COLUMN wait_class FORMAT A20
COLUMN time_waited_sec FORMAT 999999.99
COLUMN waits_per_sec FORMAT 9999.99
COLUMN avg_wait_ms FORMAT 9999.99
COLUMN pct_total FORMAT 999.99
SELECT
w.wait_class,
ROUND(w.time_waited / 100, 2) AS time_waited_sec,
ROUND(w.wait_count / 60, 2) AS waits_per_sec, -- 除以60秒间隔
ROUND((w.time_waited / NULLIF(w.wait_count, 0)) * 10, 2) AS avg_wait_ms, -- 厘秒->毫秒
ROUND((w.time_waited / total.total_time) * 100, 2) AS pct_total,
TO_CHAR(w.begin_time, 'HH24:MI:SS') AS begin_time,
TO_CHAR(w.end_time, 'HH24:MI:SS') AS end_time
FROM
v$waitclassmetric w,
(SELECT SUM(time_waited) AS total_time
FROM v$waitclassmetric
WHERE wait_class != 'Idle') total
WHERE
w.wait_class != 'Idle'
ORDER BY
w.time_waited DESC;
6. 关键知识点总结
- 时间间隔聚合:V$WAITCLASSMETRIC 提供的是按时间间隔聚合的数据(默认60秒),而不是实时瞬时值。这有助于观察趋势而非瞬间波动。
- 等待类别维度:该视图按等待类别分组数据,这比分析单个等待事件更高效,适合高层性能分析。
- 数据保留:视图通常只保留最近11个间隔的数据(约11分钟)。对于长期分析,需要使用 DBA_HIST_WAITCLASSMETRIC。
- 关键指标:
TIME_WAITED:最重要的指标,显示等待的严重程度WAIT_COUNT:结合时间可计算平均等待时间AVERAGE_WAITER_COUNT:指示并发等待的严重程度
- 排除空闲等待:在分析时通常需要过滤掉
Idle等待类别,因为这些等待不代表真正的性能问题。 - RAC 环境:在 RAC 环境中,需要关注
INST_ID字段,或者使用GV$WAITCLASSMETRIC全局视图来查看所有实例的数据。 - 性能基线比较:有效的性能分析需要将当前指标与基线值进行比较,而不仅仅是查看绝对值。
- 根本原因分析:识别出问题等待类别后,通常需要钻取到更细粒度的视图(如 V$EVENTMETRIC)来找到具体的等待事件。
补充:与系统指标关联分析
-- 关联等待类别和系统I/O指标
SELECT
w.wait_class,
ROUND(w.time_waited / 100, 2) AS io_wait_seconds,
(SELECT ROUND(value/1024/1024, 2)
FROM v$sysmetric
WHERE metric_name = 'Physical Read Total Bytes Per Sec'
AND group_id = 2) AS read_mb_per_sec
FROM v$waitclassmetric w
WHERE w.wait_class = 'User I/O';
总之,V$WAITCLASSMETRIC 是 Oracle 数据库性能监控工具包中的核心组件。它提供了高级别的性能视图,帮助DBA快速识别和理解系统级的性能瓶颈。通过熟练掌握此视图,可以建立有效的性能监控体系,快速响应性能问题,并做出基于数据的优化决策。
欢迎关注我的公众号《IT小Chen》
Oracle V$WAITCLASSMETRIC 性能视图解析

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



