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

在这里插入图片描述
好的,我们来对 Oracle 19C 数据库中的 V$CELL_DB_HISTORY 动态性能视图进行一次全面、深入的解析。

这个视图是 Oracle Exadata 数据库机器环境中的历史性能数据视图,它是 V$CELL_DB 的历史版本,提供了数据库实例与 Exadata 存储单元之间 I/O 操作的随时间变化的性能统计信息


1. 作用与简介

核心作用:
V$CELL_DB_HISTORY 动态性能视图用于展示在过去一段时间内,数据库实例发出的 I/O 请求被 Exadata 存储单元处理后的聚合性能结果历史统计。它记录了 V$CELL_DB 中数据的时间序列快照,允许用户进行趋势分析、性能基线和历史问题诊断。

背景知识:

  • AWR (Automatic Workload Repository): Oracle 自动负载信息库,定期(默认每小时)收集并保存性能快照。
  • 历史性能数据V$ 视图通常只显示自实例启动以来的累积值或当前状态,而 *_HISTORY 视图(如 V$CELL_DB_HISTORY)则提供了基于 AWR 快照间隔的历史视图,使得分析特定时间段内的性能成为可能。

简单来说,如果 V$CELL_DB 回答“现在/总共怎么样?”,那么 V$CELL_DB_HISTORY 回答“在过去的某个时间段内,性能是如何变化的?”。


2. 使用场景

  1. 性能趋势分析与基线建立

    • 观察关键指标(如卸载效率 IO_OFFLOAD_EFFICIENCY、平均读取时间 AVG_READ_TIME)随时间的变化趋势。
    • 建立性能基线,识别出与正常模式偏离的异常时间段。
  2. 历史问题诊断与事后分析

    • 当用户报告“昨天下午系统很慢”时,DBA 可以查询此视图,定位到具体的时间段,分析当时的存储 I/O 性能,判断是否是 Exadata 存储层导致了问题。
  3. 容量规划与资源评估

    • 分析历史 I/O 负载(PHYSICAL_READ_BYTES, PHYSICAL_WRITE_BYTES)的增长趋势,为未来的存储容量和性能规划提供数据支持。
  4. 效率优化评估

    • 对比在应用变更(如新建索引、SQL 优化)前后,智能卸载效率的变化,从而量化优化措施带来的收益。

3. 字段含义详解

V$CELL_DB_HISTORY 视图的结构与 V$CELL_DB 非常相似,但增加了关键的时间维度字段。其统计值是每个快照间隔内的增量值,而非累积值。

| 字段名 | 数据类型 | 含义 |
| :— | :— | :— |
| BEGIN_TIME | DATE | 此历史统计记录的时间段开始时间。 |
| END_TIME | DATE | 此历史统计记录的时间段结束时间。 |
| DB_NAME | VARCHAR2(30) | 生成这些I/O统计信息的数据库实例的名称。 |
| INST_ID | NUMBER | (在 RAC 中) 实例标识符。 |
| SAMPLE_INTERVAL | NUMBER | 采样间隔的秒数。通常是 AWR 快照间隔(默认3600秒)。 |
| SAMPLE_TIME | DATE | 采样时间。通常等于 END_TIME。 |
| CON_ID | NUMBER | 容器ID。 |
| 性能统计字段 (与V$CELL_DB含义相同,但是时间段内的增量) | | |
| IO_OFFLOAD_ELIG_BYTES | NUMBER | 在此时间段内,符合卸载条件的I/O请求的字节数。 |
| IO_OFFLOAD_RETURN_BYTES | NUMBER | 在此时间段内,实际通过卸载操作返回给数据库的字节数。 |
| IO_OFFLOAD_EFFICIENCY | NUMBER | 此时间段内的平均卸载效率。 |
| PHYSICAL_READ_REQUESTS | NUMBER | 此时间段内的物理读请求次数。 |
| PHYSICAL_READ_BYTES | NUMBER | 此时间段内物理读取的总字节数。 |
| PHYSICAL_WRITE_REQUESTS | NUMBER | 此时间段内的物理写请求次数。 |
| PHYSICAL_WRITE_BYTES | NUMBER | 此时间段内物理写入的总字节数。 |
| IO_INTERCONNECT_BYTES | NUMBER | 此时间段内通过InfiniBand互联网络传输的总字节数。 |
| AVG_READ_TIME | NUMBER | 此时间段内的平均读操作耗时(微秒)。 |
| AVG_WRITE_TIME | NUMBER | 此时间段内的平均写操作耗时(微秒)。 |
| IO_SAVED_FILTER_BYTES | NUMBER | 此时间段内通过谓词过滤节省的字节数。 |
| IO_SAVED_PROJECTION_BYTES | NUMBER | 此时间段内通过列投影节省的字节数。 |
| IO_SAVED_STORAGE_INDEX_BYTES | NUMBER | 此时间段内通过存储索引节省的字节数。 |


4. 相关视图与基表

  • 相关动态性能视图

    • V$CELL_DB: 提供当前实例启动以来的累积值实时快照。是 V$CELL_DB_HISTORY 的实时数据来源。
    • DBA_HIST_DATABASE_INSTANCE: 包含数据库实例的历史信息,可与 INST_ID 关联。
    • DBA_HIST_SNAPSHOT: 包含 AWR 快照的元数据(BEGIN_TIME, END_TIME, SNAP_ID等),是查询历史数据时的主要关联视图。
    • DBA_HIST_SQLSTAT: 包含 SQL 语句的历史性能统计。要分析历史时间段内哪些 SQL 导致了高 I/O 或低卸载效率,需要关联此视图。
  • 基表 (Underlying Table)

    • V$CELL_DB_HISTORY 是一个动态性能视图,其数据来源于 AWR 的底层基表,最主要是 WRH$_CELL_DB_HISTORY
    • 工作原理
      1. MMON 进程定期(基于 AWR 快照设置)将 V$CELL_DB 等内存中的性能统计信息刷新到 AWR 基表中。
      2. 这些数据被写入到 WRH$_CELL_DB_HISTORY 表中,并打上快照时间戳。
      3. V$CELL_DB_HISTORY 视图通过一个公开的接口来查询这些 AWR 基表,为用户提供一个易于查询的历史视图。
    • 直接查询 WRH$ 表是不被支持且极其不推荐的。

5. 底层详细原理

  1. AWR 快照机制

    • 这是 V$CELL_DB_HISTORY 数据的来源。默认每隔一小时,后台进程 MMON (Manageability Monitor) 会执行一次快照,收集各种 V$ 视图的当前数据。
    • 对于 V$CELL_DB,快照过程会计算当前快照时刻的数值与上一次快照时刻数值的差值,并将这个增量值与时间戳一起存入 WRH$_CELL_DB_HISTORY 基表。
    • 这就解释了为什么 V$CELL_DB_HISTORY 中的值是“时间段内的增量”,而不是 V$CELL_DB 中的“自启动以来的累积值”。
  2. 数据保留与管理

    • 历史数据的保留策略由 AWR_RETENTION 参数控制,默认保留 8 天。
    • 过期的快照数据会被 MMONM000 进程自动清理(purge),以释放空间。
  3. 视图查询机制

    • 当用户查询 V$CELL_DB_HISTORY 时,Oracle 并不是直接去读复杂的 WRH$ 基表,而是通过一个定义好的视图来访问这些数据。
    • 这个视图会对底层基表的数据进行转换和格式化,使其更易于理解和查询。

6. 常用查询SQL示例

1. 查看最近N个小时内,每个快照间隔的卸载效率和平均读时间(趋势分析)

SELECT TO_CHAR(begin_time, 'MM-DD HH24:MI') AS begin_time,
       TO_CHAR(end_time, 'HH24:MI') AS end_time,
       ROUND(io_offload_efficiency, 2) AS offload_eff,
       ROUND(avg_read_time / 1000, 2) AS avg_read_ms,
       ROUND(physical_read_bytes / 1024 / 1024, 2) AS physical_read_mb
FROM v$cell_db_history
WHERE begin_time > SYSDATE - INTERVAL '12' HOUR -- 查看过去12小时
ORDER BY begin_time DESC;

2. 定位历史性能问题时间段(例如,寻找平均读取时间异常高的时段)

SELECT TO_CHAR(begin_time, 'YYYY-MM-DD HH24:MI') AS begin_time,
       TO_CHAR(end_time, 'HH24:MI') AS end_time,
       ROUND(avg_read_time / 1000, 2) AS avg_read_ms,
       ROUND(io_offload_efficiency, 2) AS offload_eff,
       physical_read_requests
FROM v$cell_db_history
WHERE avg_read_time > 20000 -- 寻找平均读时间大于20ms的时段
ORDER BY avg_read_time DESC;

3. 对比不同时间段的I/O负载(容量规划)

SELECT TO_CHAR(TRUNC(begin_time, 'HH'), 'YYYY-MM-DD HH24:MI') AS hour,
       SUM(physical_read_bytes) / 1024 / 1024 AS total_read_mb_per_hour,
       SUM(physical_write_bytes) / 1024 / 1024 AS total_write_mb_per_hour,
       ROUND(AVG(io_offload_efficiency), 2) AS avg_offload_eff
FROM v$cell_db_history
WHERE begin_time > SYSDATE - INTERVAL '7' DAY -- 过去7天
GROUP BY TRUNC(begin_time, 'HH')
ORDER BY hour;

4. 在RAC环境中,分析各实例的历史I/O负载分布

SELECT inst_id,
       TO_CHAR(begin_time, 'MM-DD HH24:MI') AS time,
       ROUND(physical_read_bytes / 1024 / 1024, 2) AS read_mb,
       ROUND(physical_write_bytes / 1024 / 1024, 2) AS write_mb
FROM v$cell_db_history
WHERE begin_time > SYSDATE - INTERVAL '3' HOUR
ORDER BY inst_id, begin_time;

5. 深入分析:关联AWR快照表获取更精确的时间范围

SELECT c.begin_time, c.end_time, c.avg_read_time, s.snap_id
FROM v$cell_db_history c
JOIN dba_hist_snapshot s ON (c.begin_time = s.begin_interval_time AND c.end_time = s.end_interval_time)
WHERE c.begin_time > SYSDATE - 1
AND c.avg_read_time > 15000
ORDER BY c.avg_read_time DESC;
-- 找到SNAP_ID后,可以进一步生成该时间段的AWR报告进行深度分析

总结

V$CELL_DB_HISTORYOracle Exadata 环境中进行存储性能趋势分析和历史问题回溯强大工具

  • 核心价值:它将 V$CELL_DB 的实时/累积数据转化为带时间戳的历史增量数据,使得性能分析从静态快照变为动态趋势追踪。
  • 监控重点
    • BEGIN_TIMEEND_TIME: 所有分析都必须基于这两个时间字段。
    • IO_OFFLOAD_EFFICIENCYAVG_READ_TIME 的趋势: 核心性能指标随时间的变化。
    • I/O 负载的周期性模式: 发现业务高峰和低谷。
  • 使用哲学
    1. 它是事后诊断趋势分析的利器,而非实时监控工具。
    2. 总是结合时间范围进行查询,否则数据没有意义。
    3. 当在其中发现异常时间段后,应进一步利用 AWR 报告DBA_HIST_SQLSTAT 等工具进行下钻分析(Drill-Down),定位到具体的问题SQL。
    4. 理解其数据是快照间隔内的增量,这与其他 AWR 历史视图的行为一致。

对于需要深入了解 Exadata 存储性能历史模式和解决“过去发生了什么”这类问题的DBA来说,V$CELL_DB_HISTORY 是一个不可或缺的视图。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值