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

在这里插入图片描述

📊 深入解析 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 WAITCLASSMETRICHISTORYVWAITCLASSMETRIC 的历史扩展版本,它提供了更长时间范围内的等待类别性能指标历史数据。这个视图是 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_IDNUMBERNO等待类别的内部标识符。Oracle 内部使用的数字ID。
WAIT_CLASS#NUMBERNO等待类别的编号。与 V$SYSTEM_WAIT_CLASS 中的等待类别编号对应。
WAIT_CLASSVARCHAR2(64)NO等待类别名称。重要分类字段,包括:
- User I/O:用户I/O等待
- System I/O:系统I/O等待
- Concurrency:并发等待
- Commit:提交等待
- Network:网络等待
- Application:应用程序等待
- Configuration:配置相关等待
- Administrative:管理任务等待
- Cluster:RAC集群等待
- Other:其他等待
- Idle:空闲等待
TIME_WAITEDNUMBERNO在特定时间间隔内,此类等待的总等待时间(厘秒)。1秒 = 100厘秒。
WAIT_COUNTNUMBERNO在特定时间间隔内,此类等待的发生次数
AVERAGE_WAITER_COUNTNUMBERYES在特定时间间隔内,平均同时等待的会话数
DBTIMENUMBERYES数据库时间(Database Time)。该时间间隔内的总数据库时间消耗。
GROUP_IDNUMBERNO指标组标识符。用于内部管理。
INST_IDNUMBERNO(在 RAC 环境中)实例标识符
BEGIN_TIMEDATENO时间间隔的开始时间
END_TIMEDATENO时间间隔的结束时间

3. 工作原理与底层机制

3.1 性能指标收集体系

Oracle 使用一个多层次的性能指标收集系统:

  1. 实时数据V$WAITCLASSMETRIC - 保存最近11个间隔(约11分钟)
  2. 近期历史V$WAITCLASSMETRIC_HISTORY - 保存最近15个间隔(约15分钟)
  3. 长期历史DBA_HIST_WAITCLASSMETRIC - 通过 AWR 快照保存长期历史数据

3.2 数据流转过程

V$WAITCLASSMETRIC_HISTORY 的数据流转过程如下:

  1. 数据生成:Oracle 内核持续收集等待事件数据,每秒钟更新内存中的统计信息。
  2. 间隔聚合:每60秒,系统将累积的等待统计数据聚合到时间间隔桶中。
  3. 循环缓冲区
    • 最新11个间隔的数据存放在 V$WAITCLASSMETRIC 的循环缓冲区中
    • 接下来的15个间隔(更早的数据)存放在 V$WAITCLASSMETRIC_HISTORY 的循环缓冲区中
  4. AWR 持久化:每小时(或自定义间隔),AWR 快照进程将内存中的性能数据(包括这些指标)持久化到磁盘上的 AWR 表中,形成 DBA_HIST_WAITCLASSMETRIC
  5. 数据老化:当新的时间间隔数据产生时,最旧的数据会被覆盖,保持总共约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_WAITCLASSMETRICAWR 历史等待类别指标,用于长期趋势分析。相同的数据结构,用于历史数据分析。
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. 关键知识点总结

  1. 时间范围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分钟的性能历史数据。
  2. 数据流转:数据从 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快照)。
  3. 循环缓冲区:数据存储在SGA的循环缓冲区中, oldest的数据会被新数据覆盖。
  4. 性能诊断:此视图特别适合诊断间歇性性能问题分析性能趋势
  5. 等待类别分析:通过聚合到等待类别级别,简化了性能分析,帮助快速定位问题方向。
  6. 关键指标
    • TIME_WAITED:等待时间的总量(厘秒)
    • WAIT_COUNT:等待事件的发生次数
    • AVERAGE_WAITER_COUNT:并发等待的严重程度指标
  7. RAC 环境:在 RAC 环境中,需要关注 INST_ID 字段,或使用 GV$WAITCLASSMETRIC_HISTORY 查看所有实例的数据。
  8. 与实时监控的关系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;

最佳实践建议

  1. 定期监控:建立定期查询此视图的监控作业,捕获性能趋势
  2. 基线建立:使用历史数据建立性能基线,用于异常检测
  3. 告警设置:基于历史数据设置合理的性能告警阈值
  4. 容量规划:使用趋势数据预测未来的资源需求
  5. 关联分析:将此视图数据与其他性能视图(如 V$SYSMETRIC_HISTORY)关联分析

总之,V$WAITCLASSMETRIC_HISTORY 是 Oracle 数据库性能管理体系中承上启下的关键组件,它填补了实时监控和长期历史分析之间的空白,为DBA提供了分析近期性能趋势和诊断间歇性问题的强大工具。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值