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

在这里插入图片描述
好的,我们来深入解析 Oracle 19C 数据库中 V$SYSMETRIC_HISTORY 动态性能视图。这个视图是 V$SYSMETRIC 的时间序列扩展,提供了对近期历史性能指标的洞察,是进行短期性能问题回溯和趋势分析的利器。

📊 Oracle 19C V$SYSMETRIC_HISTORY 动态性能视图详解

1 视图概述与核心作用

V$SYSMETRIC_HISTORY 视图存储了系统级性能指标的历史记录。它包含了 V$SYSMETRIC 中当前指标在过去一段时间(通常约为1小时)内的历史值。每条记录代表一个完整时间间隔(60秒或15秒)内的指标聚合值。

其核心作用是让DBA能够:

  • 短期趋势分析:查看一个指标在过去一段时间内的变化趋势,例如CPU使用率是如何逐步升高的。
  • 问题回溯:当发现问题(如一个短暂的性能尖峰)后,可以回溯查看问题发生时刻前后的详细指标情况。
  • 关联分析:将多个指标在相同时间序列上进行对齐,分析其相关性(如redo生成量的激增是否伴随着log file sync等待时间的增加)。

2 字段详解

V$SYSMETRIC_HISTORY 的字段与 V$SYSMETRIC 高度相似,但因其存储的是历史序列,理解其时间字段至关重要。

字段名称 (Field Name)数据类型描述
BEGIN_TIMEDATE该条指标记录所对应时间窗口的开始时间。这是查询和历史回溯时最重要的时间戳。
END_TIMEDATE该条指标记录所对应时间窗口的结束时间
INTSIZE_CSECNUMBER时间间隔大小,以百分之一秒(Centi-second)为单位。常见值:6000(60秒)、1500(15秒)。
GROUP_IDNUMBER指标分组ID。在 V$SYSMETRIC_HISTORY 中,这个ID用于标识不同的指标集合。关键值为:
- 2:代表 60秒 间隔的指标集合。
- 3:代表 15秒 间隔(更高频率)的指标集合。查询时按此字段过滤至关重要。
METRIC_NAMEVARCHAR2(64)性能指标的名称(例如:"CPU Usage Per Sec", "Physical Reads Per Sec")。
METRIC_UNITVARCHAR2(64)指标值的单位(例如:"CentiSeconds Per Second", "Requests Per Second")。
VALUENUMBER在该历史时间间隔内收集到的指标值
METRIC_IDNUMBER指标的唯一数字标识符,与 METRIC_NAME 对应。
CON_IDNUMBER容器ID(Container ID)。在多租户环境(CDB)中,标识该指标数据来源于哪个PDB。值为0通常表示属于CDB$ROOT。

关键字段解读

  • GROUP_ID这是与 V$SYSMETRIC 视图最重要的区别之一。在 V$SYSMETRIC_HISTORY 中,GROUP_ID 明确指示了指标的时间粒度。你必须使用 WHERE GROUP_ID = 2 来查询60秒间隔的历史数据,这与 V$SYSMETRIC 中使用 INTSIZE_CSEC = 6000 是等价的,但方法是标准做法。
  • BEGIN_TIME:此视图包含多行数据,每行有不同的 BEGIN_TIME,构成了一个时间序列。这是进行历史回溯和趋势绘图的基础。

3 底层原理与相关对象

3.1 底层原理

  1. 循环缓冲区V$SYSMETRIC_HISTORY 的数据同样存储在SGA的内存结构中。其底层是一个循环缓冲区(Circular Buffer)
  2. 数据填充与淘汰
    • MMON进程每隔一个间隔(60秒或15秒)就会计算出一组新的指标值。
    • 这组新值会被添加到 V$SYSMETRIC_HISTORY 缓冲区的末尾。
    • 由于缓冲区大小固定,当缓冲区被填满后,最旧的历史数据会被新数据覆盖。
  3. 数据保留时间:该缓冲区通常设计为保留大约1小时的历史数据(具体保留的间隔数量取决于缓冲区大小和采样频率)。例如,对于60秒间隔(GROUP_ID=2),大约会保留60个间隔(60分钟)的数据;对于15秒间隔(GROUP_ID=3),大约会保留240个间隔(60分钟)的数据。
  4. AWR快照:每隔一个AWR快照周期(默认60分钟),MMON进程会执行一次快照操作,将 V$SYSMETRIC_HISTORY 缓冲区中的所有数据(包括所有60秒和15秒的指标)刷新到AWR仓库的底层基表(如 WRH$_SYSMETRIC_HISTORY)中,从而转化为长期、持久化的历史数据,供AWR报告使用。
  5. 基表:同 V$SYSMETRIC 一样,其数据来源于内存中的 X$ 表(如 X$SYSMETRIC_HISTORY),DBA不应直接查询。

3.2 相关视图

  • V$SYSMETRIC:提供当前最新一个时间间隔的系统指标值。是 V$SYSMETRIC_HISTORY 序列中最新的一条记录。
  • V$METRICNAME:提供指标的元数据(名称、单位、描述等),用于关联查询。
  • V$METRICGROUP:显示所有指标分组的信息,可以查看 GROUP_ID 与分组名的对应关系。
  • DBA_HIST_SYSMETRIC_HISTORY:AWR快照中保存的 V$SYSMETRIC_HISTORY 的长期历史数据。这是进行数天、数周或数月级别性能历史分析的主要数据源。
  • DBA_HIST_SYSMETRIC_SUMMARY:AWR快照中对系统指标的摘要统计(最大值、最小值、平均值、标准差等)。

4 主要使用场景

  1. 短期性能问题诊断:当用户报告“10分钟前数据库很慢”,你可以立即查询此视图,回顾问题发生时间段内的各项指标,定位瓶颈。
  2. 性能趋势可视化:监控工具可以通过定期查询此视图,绘制出CPU、IO、内存等关键指标在近一小时的趋势图,提供实时监控仪表盘。
  3. 根因分析(RCA):将一个性能事件(如应用响应慢)与数据库指标(如某一时刻的DB CPUUser I/O Wait Time激增)进行时间上的关联,验证假设。
  4. 容量评估:观察系统在业务高峰时段的历史表现,评估当前资源配置是否足够。

5 常用SQL查询示例

5.1 查看某一指标(如CPU使用率)的近期历史趋势

这是最经典的用法,绘制CPU使用的历史曲线。

SELECT BEGIN_TIME,
       ROUND(VALUE, 2) AS "CPU Usage %"
FROM V$SYSMETRIC_HISTORY
WHERE METRIC_NAME = 'CPU Usage Per Sec'
AND GROUP_ID = 2 -- 指定60秒间隔的历史数据
ORDER BY BEGIN_TIME DESC;

5.2 对比多个关键指标的历史序列

此查询将多个核心指标在相同时间点上的值进行对齐,便于分析关联性。

SELECT 
    h.BEGIN_TIME,
    MAX(CASE WHEN h.METRIC_NAME = 'CPU Usage Per Sec' THEN ROUND(h.VALUE, 2) END) AS "CPU Usage %",
    MAX(CASE WHEN h.METRIC_NAME = 'Physical Reads Per Sec' THEN ROUND(h.VALUE, 2) END) AS "Phys Reads/s",
    MAX(CASE WHEN h.METRIC_NAME = 'Logical Reads Per Sec' THEN ROUND(h.VALUE, 2) END) AS "Logical Reads/s",
    MAX(CASE WHEN h.METRIC_NAME = 'Redo Generated Per Sec' THEN ROUND(h.VALUE, 2) END) AS "Redo Bytes/s"
FROM V$SYSMETRIC_HISTORY h
WHERE h.METRIC_NAME IN (
    'CPU Usage Per Sec',
    'Physical Reads Per Sec',
    'Logical Reads Per Sec',
    'Redo Generated Per Sec'
)
AND h.GROUP_ID = 2
GROUP BY h.BEGIN_TIME
ORDER BY h.BEGIN_TIME DESC;

5.3 查询特定时间段内等待事件的历史排名

找出在过去的某一小时内,哪些等待事件是主要的瓶颈。

SELECT METRIC_NAME,
       ROUND(AVG(VALUE), 2) AS "Avg Waits Per Sec",
       ROUND(MAX(VALUE), 2) AS "Max Waits Per Sec"
FROM V$SYSMETRIC_HISTORY
WHERE (METRIC_NAME LIKE '%Wait Time%' OR METRIC_NAME LIKE '%Waits%')
AND GROUP_ID = 2
AND BEGIN_TIME > SYSDATE - 1/24 -- 查询最近1小时的数据
AND VALUE > 0
GROUP BY METRIC_NAME
ORDER BY "Avg Waits Per Sec" DESC;

5.4 使用更高频率(15秒)的数据进行细粒度分析

当问题非常短暂时(如持续30秒的阻塞),15秒间隔的数据能提供更精细的视角。

SELECT BEGIN_TIME,
       ROUND(VALUE, 2) AS "Value"
FROM V$SYSMETRIC_HISTORY
WHERE METRIC_NAME = 'CPU Usage Per Sec'
AND GROUP_ID = 3 -- 指定15秒间隔的高频历史数据
ORDER BY BEGIN_TIME DESC;

6 重要知识点与原理延伸

  • 数据生命周期:理解 V$SYSMETRIC_HISTORY -> AWR快照 -> DBA_HIST_* 这个数据流至关重要。V$SYSMETRIC_HISTORY 是位于内存中的短期、高频、易失的数据池,而AWR是其持久化到磁盘后的长期、低速、非易失的存档。
  • 性能开销:收集这些指标的系统开销极低,是Oracle自动负载仓库功能的一部分,通常无需担心其性能影响。
  • 与Statspack的关系V$SYSMETRIC_HISTORY 和 AWR 是现代Oracle版本中取代旧版Statspack的工具,提供了更丰富、更实时、更易用的性能数据。
  • 多租户查询:在CDB中,你可以从根容器(CDB$ROOT)查询整个CDB的指标,也可以通过 CON_ID 过滤特定PDB的数据。连接到某个PDB时,查询到的则是该PDB的指标。
  • 指标值的含义:务必结合 METRIC_UNIT 来理解 VALUE。例如,"CPU Usage Per Sec" 的单位是 "CentiSeconds Per Second",值50代表一个CPU核心的50%利用率。在有多颗CPU的服务器上,该值可能超过100,表示多个CPU核心都在被使用。

掌握 V$SYSMETRIC_HISTORY 视图,意味着你拥有了对数据库近期“健康状况”进行复盘和追溯的能力,是从被动救火转向主动性能管理的关键一步。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值