AWR报告中的Result Cache Hit Ratio不准确,需结合v$result_cache_statistics和v$result_cache_memory验证;命中率应重算为Find Count/(Find Count+Create Count),并检查Invalid状态、Delete Count与Create Count比值、shared pool空闲内存及是否真需启用Result Cache。
查Result Cache命中率不能只看AWR报告里的一个数字
awr报告的「instance efficiency percentages」里确实有result cache hit ratio,但它只是粗略统计,不区分缓存内容类型、不反映失效频率、也不体现内存使用效率。实际中常出现“命中率95%但业务没变快”的情况——因为大量低复用查询占满缓存,真正高频sql反而被挤出去。
必须结合v$result_cache_statistics和v$result_cache_memory手动验证
AWR快照只保存聚合值,要定位问题得查动态视图:
-
v$result_cache_statistics提供Create Count、Find Count、Delete Count等原始计数,命中率应按Find Count / (Find Count + Create Count)重算,比AWR更准 -
v$result_cache_memory显示当前各缓存块的大小和状态,重点看STATUS = 'Invalid'是否过多——说明频繁失效,不是命中率低,而是缓存稳不住 - 若
Delete Count接近Create Count,基本可断定缓存刚建好就被淘汰,此时调大result_cache_max_size无效,得查是什么触发了失效(比如表统计信息更新、DDL、或ALTER SYSTEM FLUSH RESULT_CACHE)
识别干扰源:FORCE模式和高频率低复用SQL
result_cache_mode = FORCE会让所有可缓存查询强制进Result Cache,表面命中率虚高,但实际加重shared pool压力,还可能引发latch: result cache争用。更隐蔽的问题是应用层SQL:
- 带动态时间戳、会话变量、或
SYSDATE的查询,每次执行都生成新结果集,Create Count暴涨但Find Count几乎为0 - 监控脚本频繁查
dba_objects这类字典视图,虽能缓存,但复用率极低,白白占用内存 - 用
/*+ NO_RESULT_CACHE */在关键SQL上显式禁用,比全局调参更安全
调优前先确认result_cache_max_size是否真被用满
很多人一看到命中率低就加内存,但v$result_cache_memory的MAXIMUM_MEMORY字段才是真实上限——它受shared_pool_size限制,即使你设了1G,若shared pool只剩500M空闲,Result Cache最多只能用500M。检查步骤:
- 运行
SELECT component, current_size/1024/1024 AS mb FROM v$sgastat WHERE pool = 'shared pool' AND name = 'free memory'; - 对比
SHOW PARAMETER result_cache_max_size,若前者远小于后者,说明shared pool已吃紧,加Result Cache只会加剧library cache: mutex X等待 - 临时调小
result_cache_max_size观察latch: result cache等待是否下降,比盲目加大更有效











