
好的,我们来对 Oracle 19C 数据库中的 V$CACHE 动态性能视图进行一次全面、深入的解析。
这个视图在 Oracle Real Application Clusters (RAC) 环境中至关重要,它提供了整个集群范围内缓冲区缓存(Buffer Cache)中数据块的全局视图。
1. 作用与简介
核心作用:
V$CACHE 动态性能视图用于在 Oracle RAC 环境中显示所有实例的缓冲区缓存中当前缓存的每一个数据块(Block)的详细信息。它提供了集群范围内缓存内容的全局一致性视图,是理解和管理RAC缓存融合(Cache Fusion)机制的关键。
背景知识:
- RAC (Real Application Clusters): 多个数据库实例同时挂载并打开同一个数据库,提供高可用性和可扩展性。
- 缓冲区缓存 (Buffer Cache): 每个实例都有自己的SGA和缓冲区缓存,用于在内存中缓存数据块。
- 缓存融合 (Cache Fusion): RAC的核心技术。它允许实例之间通过高速互连网络直接传递数据块,而不是总是从磁盘读取,从而极大提升了性能。
- 全局缓存服务 (GCS): 负责协调和管理所有实例对缓存中数据块的并发访问,跟踪每个块的状态和位置。
V$CACHE 本质上是当前实例视角下的全局缓存目录,它知道每个块在集群中的状态。
2. 使用场景
-
RAC性能诊断与热点块分析:
- 识别被所有实例频繁访问的"热点"数据块(高
COUNT值)。这些块可能导致大量的全局缓存传输(gc cr request,gc current request等待事件)。 - 分析数据块在实例间的分布情况,判断是否存在缓存资源倾斜。
- 识别被所有实例频繁访问的"热点"数据块(高
-
理解缓存融合行为:
- 通过查看块的
STATUS和MODE_HELD,可以了解块在集群中的当前状态(例如,是当前模式还是一致性读模式,是共享还是独占)。 - 当出现全局缓存等待事件时,使用此视图调查特定文件中的特定块。
- 通过查看块的
-
故障排查与恢复:
- 在实例崩溃或应用维护时,了解哪些块是"脏"的(
DIRTY=Y)以及它们位于哪个实例,对于问题分析很有帮助。
- 在实例崩溃或应用维护时,了解哪些块是"脏"的(
-
高级性能调优:
- 结合
DBA_EXTENTS,可以将热点块映射到具体的表和段,从而进行更深层次的优化,如考虑分区、调整PCTFREE或使用反向键索引等。
- 结合
3. 字段含义详解
V$CACHE 视图中的每一行代表一个当前在任何实例的缓冲区缓存中的数据块。以下是其核心字段:
| 字段名 | 数据类型 | 含义 |
| :— | :— | :— |
| FILE# | NUMBER | 数据块所在的数据文件编号。可与 V$DATAFILE 或 DBA_DATA_FILES 关联。 |
| BLOCK# | NUMBER | 数据块在数据文件中的编号。与 FILE# 共同唯一标识一个数据块。 |
| STATUS | VARCHAR2(1) | 块在全局缓存中的状态。 |
| | | • FREE: 缓冲区为空闲。 |
| | | • XCUR: 当前模式独占。实例已修改该块。 |
| | | • SCUR: 当前模式共享。实例正在以当前模式读取该块。 |
| | | • CR: 一致性读。实例正在维护该块的一个读一致性副本。 |
| | | • READ: 正在从磁盘读取该块。 |
| MODE_HELD | VARCHAR2(1) | 当前实例对该块持有的锁模式。 |
| | | • N: 无 (Null)。 |
| | | • S: 共享 (Shared)。 |
| | | • X: 独占 (Exclusive)。 |
| DIRTY | VARCHAR2(1) | 指示该块是否为"脏"块。即,是否已被修改而未写入磁盘。Y 表示是脏块,N 表示不是。 |
| FORCED_READS | NUMBER | 强制读取的次数(已废弃,通常为0)。 |
| FORCED_WRITES | NUMBER | 强制写入的次数(已废弃,通常为0)。 |
| NAME | VARCHAR2(30) | 数据文件的名称(来自 FILE#)。 |
| PARTITION | VARCHAR2(32) | 缓冲池分区名称(内部使用)。 |
| BA | VARCHAR2(12) | 缓冲区的地址(内部使用,用于调试)。 |
| LRU_FLAG | NUMBER | LRU列表中的标志位(内部使用)。 |
| SET_ID | NUMBER | 缓冲集ID(内部使用)。 |
| HASH | NUMBER | 缓冲区的哈希值(内部使用)。 |
| EXTENT_ID | NUMBER | 该块所在的区(Extent)的ID。 |
| CLASS | NUMBER | 块的类别(如数据块、段头块、撤销块等)。 |
| COUNT | NUMBER | 访问该块的次数。高 COUNT 值通常表示该块是"热点块"。 |
| TCH | NUMBER | 触摸计数 (Touch Count)。与 COUNT 类似,是缓冲区替换算法的一个指标。 |
| LOCK_ELEMENT_ADDR | RAW(4 | 8) | 关联的全局锁元素的地址(RAC内部使用)。 |
| LOCK_ELEMENT_NAME | RAW(8) | 关联的全局锁元素的名称(RAC内部使用)。 |
4. 相关视图与基表
-
相关动态性能视图:
GV$CACHE:V$CACHE的全局版本,显示所有活动实例的缓存信息。查询此视图可以一次性获得集群的完整缓存图景。V$BH:V$CACHE在单实例环境下的等效视图,并且提供了更多细节。在单实例中,优先使用V$BH。在RAC中,V$CACHE提供了更集群化的视角。V$GC_ELEMENT/V$GC_ELEMENTS_WITH_COLLISIONS: 提供全局缓存元素的信息,用于诊断缓存融合争用。V$WAITSTAT: 提供块类级别的等待统计信息,可与V$CACHE中的CLASS字段关联。DBA_EXTENTS: 通过FILE_ID和BLOCK_ID关联,可以将缓存中的块映射到具体的表、索引等段对象。
-
基表 (Underlying Table):
V$CACHE是一个动态性能视图,其数据来源于 SGA 中的内部内存结构,特别是与全局缓存服务(GCS)相关的部分。- 它通过查询底层未公开的 X$ 表(如
X$KCBOQH、X$LE等)来获取信息。这些X表代表了GCS维护的全局缓存目录和锁元素结构。严禁直接查询X$表。
5. 底层详细原理
-
GCS与全局缓存目录:
- 在RAC环境中,GCS维护着一个全局资源目录 (Global Resource Directory, GRD)。GRD跟踪每个数据块的最新版本在哪个实例的缓存中,以及该块的状态(XCUR, SCUR, CR等)。
V$CACHE视图的内容,本质上是当前查询实例所感知到的GRD的一个子集或快照。它反映了GCS所知道的关于这些块的信息。
-
缓存融合与块状态:
- 当一个实例需要访问一个块时,它向GCS请求该块的授权。
- GCS根据块的状态和请求的模式,可能:
- 直接授权访问(如果块在本地且模式兼容)。
- 指令另一个持有该块的实例通过互联网络直接发送一个副本(CR块)给请求者。这就是"缓存融合"。
- 指令持有者降级其锁(如从X到S),以便其他实例可以共享访问。
V$CACHE中的STATUS字段直接反映了GCS协调后该块在全局范围内的最新状态。
-
视图数据查询:
- 查询
V$CACHE时,Oracle 会与GCS交互,遍历其内存中的资源结构,以构建出当前集群中所有缓存块的列表及其状态。因此,在缓存很大的系统上,查询此视图可能有一定开销。
- 查询
6. 常用查询SQL示例
1. 识别集群中的热点块(按触摸计数排序)
SELECT file#, block#, tch, status, instance_addr
FROM gv$cache -- 使用GV$以查看所有实例
WHERE tch > 100 -- 阈值可根据实际情况调整
ORDER BY tch DESC;
2. 查找特定数据文件中的脏块及其所在实例
SELECT inst_id, file#, block#, status, dirty
FROM gv$cache
WHERE file# = <your_file_id>
AND dirty = 'Y'
ORDER BY block#;
3. 将缓存中的块映射到具体的数据库对象(关键诊断查询)
SELECT c.file#, c.block#, c.status, c.tch,
e.owner, e.segment_name, e.segment_type, e.partition_name
FROM v$cache c
JOIN dba_extents e ON (c.file# = e.file_id AND c.block# BETWEEN e.block_id AND e.block_id + e.blocks - 1)
WHERE c.tch > 50
ORDER BY c.tch DESC;
4. 按块状态统计缓存块的数量
SELECT status, COUNT(*), SUM(tch)
FROM v$cache
GROUP BY status
ORDER BY COUNT(*) DESC;
5. 分析某个特定热点块在集群中的分布情况
SELECT inst_id, status, mode_held, dirty, tch
FROM gv$cache
WHERE file# = &file_id
AND block# = &block_id
ORDER BY inst_id;
总结
V$CACHE 是 Oracle RAC 环境中专有的、极其强大的诊断工具。
- 核心价值:提供了集群范围内缓冲区缓存内容的全局、统一的视图,是理解和优化缓存融合(Cache Fusion) 行为的基石。
- 监控重点:
- 热点块识别:高
TCH或COUNT值。 - 块状态分析:
STATUS(XCUR, SCUR, CR)揭示了块的并发访问模式。 - 实例间分布:使用
GV$CACHE查看块在哪个实例中。
- 热点块识别:高
- 使用哲学:不要单独使用它。总是将其与:
GV$CACHE一起使用以获得完整的集群视图。DBA_EXTENTS关联以将块映射到数据库对象(表、索引)。- 等待事件(如
gc cr block busy)关联,从而将性能问题根因定位到具体的块和对象上。
对于单实例数据库,应优先使用 V$BH 视图。但在RAC世界中,V$CACHE 是诊断全局缓存性能问题不可或缺的窗口,是高级Oracle DBA必须掌握的核心视图之一。
欢迎关注我的公众号《IT小Chen》
22

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



