
好的,我们来对 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. 使用场景
-
性能趋势分析与基线建立:
- 观察关键指标(如卸载效率
IO_OFFLOAD_EFFICIENCY、平均读取时间AVG_READ_TIME)随时间的变化趋势。 - 建立性能基线,识别出与正常模式偏离的异常时间段。
- 观察关键指标(如卸载效率
-
历史问题诊断与事后分析:
- 当用户报告“昨天下午系统很慢”时,DBA 可以查询此视图,定位到具体的时间段,分析当时的存储 I/O 性能,判断是否是 Exadata 存储层导致了问题。
-
容量规划与资源评估:
- 分析历史 I/O 负载(
PHYSICAL_READ_BYTES,PHYSICAL_WRITE_BYTES)的增长趋势,为未来的存储容量和性能规划提供数据支持。
- 分析历史 I/O 负载(
-
效率优化评估:
- 对比在应用变更(如新建索引、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。- 工作原理:
- MMON 进程定期(基于 AWR 快照设置)将
V$CELL_DB等内存中的性能统计信息刷新到 AWR 基表中。 - 这些数据被写入到
WRH$_CELL_DB_HISTORY表中,并打上快照时间戳。 V$CELL_DB_HISTORY视图通过一个公开的接口来查询这些 AWR 基表,为用户提供一个易于查询的历史视图。
- MMON 进程定期(基于 AWR 快照设置)将
- 直接查询
WRH$表是不被支持且极其不推荐的。
5. 底层详细原理
-
AWR 快照机制:
- 这是
V$CELL_DB_HISTORY数据的来源。默认每隔一小时,后台进程 MMON (Manageability Monitor) 会执行一次快照,收集各种V$视图的当前数据。 - 对于
V$CELL_DB,快照过程会计算当前快照时刻的数值与上一次快照时刻数值的差值,并将这个增量值与时间戳一起存入WRH$_CELL_DB_HISTORY基表。 - 这就解释了为什么
V$CELL_DB_HISTORY中的值是“时间段内的增量”,而不是V$CELL_DB中的“自启动以来的累积值”。
- 这是
-
数据保留与管理:
- 历史数据的保留策略由
AWR_RETENTION参数控制,默认保留 8 天。 - 过期的快照数据会被 MMON 或 M000 进程自动清理(purge),以释放空间。
- 历史数据的保留策略由
-
视图查询机制:
- 当用户查询
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_HISTORY 是 Oracle Exadata 环境中进行存储性能趋势分析和历史问题回溯的强大工具。
- 核心价值:它将
V$CELL_DB的实时/累积数据转化为带时间戳的历史增量数据,使得性能分析从静态快照变为动态趋势追踪。 - 监控重点:
BEGIN_TIME和END_TIME: 所有分析都必须基于这两个时间字段。IO_OFFLOAD_EFFICIENCY和AVG_READ_TIME的趋势: 核心性能指标随时间的变化。- I/O 负载的周期性模式: 发现业务高峰和低谷。
- 使用哲学:
- 它是事后诊断和趋势分析的利器,而非实时监控工具。
- 总是结合时间范围进行查询,否则数据没有意义。
- 当在其中发现异常时间段后,应进一步利用 AWR 报告 和
DBA_HIST_SQLSTAT等工具进行下钻分析(Drill-Down),定位到具体的问题SQL。 - 理解其数据是快照间隔内的增量,这与其他 AWR 历史视图的行为一致。
对于需要深入了解 Exadata 存储性能历史模式和解决“过去发生了什么”这类问题的DBA来说,V$CELL_DB_HISTORY 是一个不可或缺的视图。
欢迎关注我的公众号《IT小Chen》
1008

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



