Oracle 19c中使用V$BH视图查询缓冲池内容不可靠问题咨询
现象原因
- 关联字段匹配错误(核心原因)
V$BH视图的OBJD字段存储的是段的物理ID,需要和DBA_OBJECTS视图的DATA_OBJECT_ID字段匹配,而非你使用的OBJECT_ID。对于分区表这类包含多个独立子段的对象,每个分区、分区索引的OBJECT_ID(逻辑对象ID)和DATA_OBJECT_ID(物理段ID)并不一致,使用错误的关联字段自然无法匹配到缓冲块记录。 - 权限问题(次要可能)
查询V$BH底层视图V_$BH需要用户持有SELECT ANY DICTIONARY系统权限,或者被显式授予该视图的查询权限。如果权限不足也可能返回空结果,但你给出的执行统计无报错,该场景概率较低。 - 你提到的全表扫描0物理读说明数据确实从缓冲池读取,可以排除
direct path read(直接路径读,数据直接载入PGA不进入SGA缓冲池)的可能性。
可靠的缓冲池内容查询方法
正确查询语句
使用DATA_OBJECT_ID做关联,同时覆盖所有分区、索引等子段:
SELECT o.owner, o.object_name, o.subobject_name, o.object_type, COUNT(DISTINCT b.block#) AS distinct_block_count, COUNT(b.block#) AS total_block_count FROM dba_objects o, v$bh b WHERE b.objd = o.data_object_id AND b.status != 'free' AND o.owner = 'MY_SCHEMA' AND o.object_name LIKE 'GRID_LTA%' GROUP BY o.owner, o.object_name, o.subobject_name, o.object_type ORDER BY o.object_name, o.subobject_name;
额外注意事项
- 如果要单独过滤KEEP池的块,可以在WHERE条件中新增
b.buffer_pool = 'KEEP' - 19c多租户架构下如果使用PDB,可新增
b.con_id = <对应PDB的ID>过滤,避免CDB全局块干扰 - 测试环境下可以先执行
ALTER SYSTEM FLUSH BUFFER_CACHE;清空缓冲池(生产环境禁止执行,会引发严重性能抖动),再运行业务查询后查V$BH,结果会更准确无冗余。
内容的提问来源于stack exchange,提问作者Tony Zucchini
相关产品推荐
相关产品推荐

