Buffer Hit Ratio高但性能差,是因为它只是加权平均值,不反映热点块争用或SQL执行效率;需结合Physical/Logical Reads、Buffer Nowait%、I/O等待事件及v$db_cache_advice综合判断,同时排除Result Cache和In-Memory Area干扰。
Buffer Hit Ratio数值高,但性能差,为什么?
因为buffer hit ratio是加权平均值,只反映“过去一段时间里,有多少比例的数据块从缓存中读取”,不说明这些块是谁读的、怎么读的、是否重复争抢。比如一个olap系统做全表扫描,buffer hit ratio可能只有60%,但这是设计使然,并非内存不足;而一个oltp系统出现98%命中率却响应慢,很可能是热点块争用——此时latch: cache buffers chains等待事件会高频出现,buffer nowait %可能已跌破99%。
看Buffer Hit Ratio前必须核对的三个配套指标
单独看这个数字毫无意义,必须同步检查:
-
Physical Reads和Logical Reads的绝对值:如果Logical Reads暴涨(比如单个SQL占总逻辑读35%以上),说明SQL没走索引或执行计划劣化,加内存无效 -
Buffer Nowait %:低于99%就表示进程在获取buffer时频繁等待,大概率是db_cache_size偏小或存在热块,需查v$segment_statistics定位热点对象 -
db file sequential read与db file scattered read在Top 5 Timed Foreground Events中的排序:若二者长期排前两位,且Physical Reads同步上升,才说明缓存真不够用
用v$db_cache_advice验证命中率改善是否值得
该视图能基于历史负载模拟不同db_cache_size下的预估物理读下降幅度,比单纯盯命中率靠谱得多:
- 先确认
db_cache_advice = ON(否则视图返回空) - 运行
SELECT size_for_estimate, estd_physical_read_factor FROM v$db_cache_advice; - 重点看
estd_physical_read_factor从1.0开始明显下降的拐点:比如从1024M→2048M时factor从1.2降到1.05,有调优价值;若从2048M→4096M仅降到1.01,再加就是浪费 - 注意:该建议对新上线的大表扫描类SQL不适用,上线前必须用真实SQL压测buffer pool
容易被忽略的干扰项:Result Cache和In-Memory Area
这两块内存区域会分流原本属于Buffer Cache的请求,导致Buffer Hit Ratio虚高或失真:
- 如果启用了
result_cache_mode = FORCE,大量结果集被缓存,Logical Reads下降,Buffer Hit Ratio被动抬升,但实际业务逻辑未优化 -
In-Memory Area启用后,部分列式扫描走IMCU而非Buffer Cache,db file scattered read减少,但Buffer Hit Ratio无法体现这部分收益 - 查
v$result_cache_statistics和v$inmemory_area确认它们是否活跃,避免把它们的功劳算到Buffer Cache头上
Buffer Hit Ratio是否有效的,不是它本身多高,而是它背后有没有对应的等待事件收敛、逻辑读下降、SQL执行路径变优。一旦发现高命中率伴随高latch争用或某条SQL独占大量Logical Reads,优先查SQL和对象设计,而不是调db_cache_size。

















