You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL按实例分组计算Buffer Cache Hit Ratio?

按实例计算Oracle Buffer Cache命中率的正确SQL写法

我来帮你搞定这个问题~你之前用子查询没成功,大概率是因为gv$sysstat里的指标是按实例+指标名称分行存储的,得先把同一实例的三个指标值转成同一行的列,才能代入公式计算。下面给你两种靠谱的写法:

方法一:条件聚合(兼容性好,适合所有Oracle版本)

这种方式用CASE语句把每个指标的值单独汇总,再代入命中率公式:

SELECT
    inst_id,
    ROUND(1 - (SUM(CASE WHEN name = 'physical reads cache' THEN value ELSE 0 END) / 
        (SUM(CASE WHEN name = 'consistent gets from cache' THEN value ELSE 0 END) + 
         SUM(CASE WHEN name = 'db block gets from cache' THEN value ELSE 0 END))), 2) AS VALUE
FROM
    gv$sysstat
WHERE
    name IN ('consistent gets from cache', 'db block gets from cache', 'physical reads cache')
GROUP BY
    inst_id
ORDER BY
    inst_id;

逻辑说明:

  • SUM(CASE ...)会按inst_id分组,把每个指标的数值单独加总
  • 代入你给出的公式1 - (physical reads cache / (consistent gets from cache + db block gets from cache))
  • ROUND(...,2)把结果保留两位小数,和你期望的输出格式一致

方法二:PIVOT行转列(Oracle 11g+可用,写法更简洁)

如果你的Oracle版本是11g及以上,可以用PIVOT直接把行数据转成列,计算起来更直观:

SELECT
    inst_id,
    ROUND(1 - (physical_reads_cache / (consistent_gets_from_cache + db_block_gets_from_cache)), 2) AS VALUE
FROM
    gv$sysstat
PIVOT (
    SUM(value)
    FOR name IN (
        'consistent gets from cache' AS consistent_gets_from_cache,
        'db block gets from cache' AS db_block_gets_from_cache,
        'physical reads cache' AS physical_reads_cache
    )
)
ORDER BY
    inst_id;

逻辑说明:

  • PIVOT把原来按行存储的三个指标,转成同一行的三个列(consistent_gets_from_cache、db_block_gets_from_cache、physical_reads_cache)
  • 直接用转好的列代入公式计算,代码更清晰

这两种方法都能输出你想要的格式:

INST_ID VALUE
1       0.92
2       0.93

内容的提问来源于stack exchange,提问作者john true

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:45:03