
📊 深入解析 Oracle 19C 的 V$WAITCLASSMETRIC_HISTORY 视图
1. 视图概述与核心作用
V W A I T C L A S S M E T R I C H I S T O R Y ∗ ∗ 是 ∗ ∗ V WAITCLASSMETRIC_HISTORY** 是 **V WAITCLASSMETRICHISTORY∗∗是∗∗VWAITCLASSMETRIC 的历史扩展版本,它提供了更长时间范围内的等待类别性能指标历史数据。这个视图是 Oracle 数据库性能诊断和容量规划的关键工具。
- 核心作用:保存和展示比 V$WAITCLASSMETRIC 更长时间范围的等待类别性能指标,用于分析性能趋势、识别周期性问题和进行容量规划。
- 关键问题它回答:
- 数据库在过去一小时内性能等待的趋势如何?
- 是否存在周期性的性能瓶颈?
- 不同时间段的等待类别分布有什么变化?
- 系统性能是改善还是恶化?
该视图保留了大约15个时间间隔的数据(约15分钟),提供了比 V$WAITCLASSMETRIC 更长的历史视角。
2. 核心字段详解
V W A I T C L A S S M E T R I C H I S T O R Y ∗ ∗ 包含与 ∗ ∗ V WAITCLASSMETRIC_HISTORY** 包含与 **V WAITCLASSMETRICHISTORY∗∗包含与∗∗VWAITCLASSMETRIC 相同的字段结构,但包含更多的历史时间间隔数据。
| 字段名 | 数据类型 | 是否可为空 | 描述 |
|---|---|---|---|
| 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:其他等待- Idle:空闲等待 |
| TIME_WAITED | NUMBER | NO | 在特定时间间隔内,此类等待的总等待时间(厘秒)。1秒 = 100厘秒。 |
| WAIT_COUNT | NUMBER | NO | 在特定时间间隔内,此类等待的发生次数。 |
| AVERAGE_WAITER_COUNT | NUMBER | YES | 在特定时间间隔内,平均同时等待的会话数。 |
| DBTIME | NUMBER | YES | 数据库时间(Database Time)。该时间间隔内的总数据库时间消耗。 |
| GROUP_ID | NUMBER | NO | 指标组标识符。用于内部管理。 |
| INST_ID | NUMBER | NO | (在 RAC 环境中)实例标识符。 |
| BEGIN_TIME | DATE | NO | 时间间隔的开始时间。 |
| END_TIME | DATE | NO | 时间间隔的结束时间。 |
3. 工作原理与底层机制
3.1 性能指标收集体系
Oracle 使用一个多层次的性能指标收集系统:
- 实时数据:V$WAITCLASSMETRIC - 保存最近11个间隔(约11分钟)
- 近期历史:V$WAITCLASSMETRIC_HISTORY - 保存最近15个间隔(约15分钟)
- 长期历史:DBA_HIST_WAITCLASSMETRIC - 通过 AWR 快照保存长期历史数据
3.2 数据流转过程
V$WAITCLASSMETRIC_HISTORY 的数据流转过程如下:
- 数据生成:Oracle 内核持续收集等待事件数据,每秒钟更新内存中的统计信息。
- 间隔聚合:每60秒,系统将累积的等待统计数据聚合到时间间隔桶中。
- 循环缓冲区:
- 最新11个间隔的数据存放在 V$WAITCLASSMETRIC 的循环缓冲区中
- 接下来的15个间隔(更早的数据)存放在 V$WAITCLASSMETRIC_HISTORY 的循环缓冲区中
- AWR 持久化:每小时(或自定义间隔),AWR 快照进程将内存中的性能数据(包括这些指标)持久化到磁盘上的 AWR 表中,形成 DBA_HIST_WAITCLASSMETRIC
- 数据老化:当新的时间间隔数据产生时,最旧的数据会被覆盖,保持总共约26分钟的数据(11 + 15个间隔)
3.3 内存结构
该视图的数据来源于 SGA 中的内部 X$ 表(如 X$KSMVM),这些表由 Oracle 内核维护,存储了按时间间隔聚合的性能指标。
4. 主要应用场景
4.1 性能趋势分析
分析较长时间范围内的性能变化趋势。
-- 分析过去15分钟内等待类别的趋势变化
SELECT
TO_CHAR(begin_time, 'HH24:MI:SS') AS time_period,
wait_class,
ROUND(time_waited / 100, 2) AS time_waited_seconds,
wait_count,
ROUND(time_waited / NULLIF(wait_count, 0) * 10, 2) AS avg_wait_ms
FROM v$waitclassmetric_history
WHERE wait_class != 'Idle'
ORDER BY begin_time DESC, time_waited DESC;
4.2 周期性问题诊断
识别重复出现的性能问题模式。
-- 查找周期性的性能瓶颈
SELECT
wait_class,
COUNT(*) AS occurrences,
AVG(ROUND(time_waited / 100, 2)) AS avg_time_waited_seconds,
MAX(ROUND(time_waited / 100, 2)) AS max_time_waited_seconds
FROM v$waitclassmetric_history
WHERE wait_class NOT IN ('Idle', 'Network')
GROUP BY wait_class
HAVING COUNT(*) > 3
ORDER BY avg_time_waited_seconds DESC;
4.3 性能基线比较
将当前性能与近期历史进行比较。
-- 比较当前性能与近期基线
WITH current_metrics AS (
SELECT wait_class, time_waited AS current_time_waited
FROM v$waitclassmetric
WHERE begin_time = (SELECT MAX(begin_time) FROM v$waitclassmetric)
),
historical_avg AS (
SELECT wait_class, AVG(time_waited) AS avg_time_waited
FROM v$waitclassmetric_history
WHERE begin_time < (SELECT MAX(begin_time) FROM v$waitclassmetric)
GROUP BY wait_class
)
SELECT
c.wait_class,
ROUND(c.current_time_waited / 100, 2) AS current_seconds,
ROUND(h.avg_time_waited / 100, 2) AS avg_historical_seconds,
ROUND((c.current_time_waited - h.avg_time_waited) / h.avg_time_waited * 100, 2) AS pct_change
FROM current_metrics c
JOIN historical_avg h ON c.wait_class = h.wait_class
WHERE c.wait_class != 'Idle'
ORDER BY pct_change 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,
ROUND(SUM(time_waited) / (SELECT SUM(time_waited)
FROM v$waitclassmetric_history
WHERE wait_class != 'Idle') * 100, 2) AS pct_total
FROM v$waitclassmetric_history
WHERE wait_class != 'Idle'
GROUP BY wait_class
ORDER BY total_time_waited DESC;
5. 相关视图与关联查询
| 视图名称 | 描述 | 常用关联字段 |
|---|---|---|
| V$WAITCLASSMETRIC | 当前和最近11个时间间隔的等待类别指标。 | 相同的字段结构,可联合查询获取完整26分钟数据。 |
| DBA_HIST_WAITCLASSMETRIC | AWR 历史等待类别指标,用于长期趋势分析。 | 相同的数据结构,用于历史数据分析。 |
| V$SYSMETRIC_HISTORY | 系统级性能指标历史数据。 | 可通过时间间隔关联进行综合分析。 |
| V$EVENTMETRIC_HISTORY | 等待事件级别的历史指标数据。 | 可下钻分析特定等待类别的具体事件。 |
常用综合查询:完整的性能分析报告
-- 生成详细的等待类别历史性能报告
COLUMN wait_class FORMAT A20
COLUMN time_period FORMAT A11
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
TO_CHAR(begin_time, 'HH24:MI:SS') AS time_period,
wait_class,
ROUND(time_waited / 100, 2) AS time_waited_sec,
ROUND(wait_count / 60, 2) AS waits_per_sec,
ROUND((time_waited / NULLIF(wait_count, 0)) * 10, 2) AS avg_wait_ms,
ROUND((time_waited / SUM(time_waited) OVER (PARTITION BY begin_time)) * 100, 2) AS pct_total
FROM
v$waitclassmetric_history
WHERE
wait_class != 'Idle'
AND begin_time > SYSDATE - INTERVAL '15' MINUTE
ORDER BY
begin_time DESC,
time_waited DESC;
6. 关键知识点总结
- 时间范围:V W A I T C L A S S M E T R I C H I S T O R Y ∗ ∗ 保存大约 ∗ ∗ 15 个时间间隔 ∗ ∗ 的数据(约 15 分钟),与 ∗ ∗ V WAITCLASSMETRIC_HISTORY** 保存大约**15个时间间隔**的数据(约15分钟),与 **V WAITCLASSMETRICHISTORY∗∗保存大约∗∗15个时间间隔∗∗的数据(约15分钟),与∗∗VWAITCLASSMETRIC 的11个间隔结合,提供总共约26分钟的性能历史数据。
- 数据流转:数据从 V W A I T C L A S S M E T R I C ∗ ∗ 流转到 ∗ ∗ V WAITCLASSMETRIC** 流转到 **V WAITCLASSMETRIC∗∗流转到∗∗VWAITCLASSMETRIC_HISTORY,最后到 DBA_HIST_WAITCLASSMETRIC(通过AWR快照)。
- 循环缓冲区:数据存储在SGA的循环缓冲区中, oldest的数据会被新数据覆盖。
- 性能诊断:此视图特别适合诊断间歇性性能问题和分析性能趋势。
- 等待类别分析:通过聚合到等待类别级别,简化了性能分析,帮助快速定位问题方向。
- 关键指标:
TIME_WAITED:等待时间的总量(厘秒)WAIT_COUNT:等待事件的发生次数AVERAGE_WAITER_COUNT:并发等待的严重程度指标
- RAC 环境:在 RAC 环境中,需要关注
INST_ID字段,或使用GV$WAITCLASSMETRIC_HISTORY查看所有实例的数据。 - 与实时监控的关系:V W A I T C L A S S M E T R I C ∗ ∗ 用于实时监控,而 ∗ ∗ V WAITCLASSMETRIC** 用于实时监控,而 **V WAITCLASSMETRIC∗∗用于实时监控,而∗∗VWAITCLASSMETRIC_HISTORY 用于近期历史分析。
补充:下钻分析到具体等待事件
-- 当发现某个等待类别有问题时,下钻分析具体等待事件
SELECT
TO_CHAR(h.begin_time, 'HH24:MI:SS') AS time_period,
e.event_name,
SUM(e.time_waited) AS total_time_waited,
SUM(e.wait_count) AS total_waits
FROM v$eventmetric_history e
JOIN v$waitclassmetric_history h ON e.begin_time = h.begin_time
AND e.wait_class# = h.wait_class#
WHERE h.wait_class = 'User I/O'
AND h.begin_time > SYSDATE - INTERVAL '15' MINUTE
GROUP BY h.begin_time, e.event_name
ORDER BY h.begin_time DESC, total_time_waited DESC;
最佳实践建议:
- 定期监控:建立定期查询此视图的监控作业,捕获性能趋势
- 基线建立:使用历史数据建立性能基线,用于异常检测
- 告警设置:基于历史数据设置合理的性能告警阈值
- 容量规划:使用趋势数据预测未来的资源需求
- 关联分析:将此视图数据与其他性能视图(如 V$SYSMETRIC_HISTORY)关联分析
总之,V$WAITCLASSMETRIC_HISTORY 是 Oracle 数据库性能管理体系中承上启下的关键组件,它填补了实时监控和长期历史分析之间的空白,为DBA提供了分析近期性能趋势和诊断间歇性问题的强大工具。
欢迎关注我的公众号《IT小Chen》


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



