跳转到主要内容

effective_cache_size

规划器对单条查询可用 PostgreSQL 数据缓存规模的估计;它影响成本计算,但不会分配内存。
说明

Fact — 官方简述译文:设置规划器对有效数据缓存总规模的假设。

身份

类型 , integer
上游 pg_settings 类型
Context , user
普通用户可在运行时修改
单位 , 8kB
原始单位
范围 , 12147483647
最后在档版本的原始上下限
枚举值 ,
非枚举类型记为 —
分类 , Query Tuning / Planner Cost Constants
上游分类
最后 boot 值 , 524288
4 GiB (524288 × 8kB)

生命周期

Fact
首次观测 PG9.0(研究下界)
在档版本 PG9.0–19 Beta 3
移除版本
引入提交 不作断言:早于 PG9.0 研究边界
提交日期
Discussion

默认值变迁

PG9.0–19 Beta 3 实测 boot 默认值
版本 原始 boot_val 单位 人类可读值
PG9.0–9.3 16384 8kB 128 MiB (16384 × 8kB)
PG9.4–19 Beta 3 524288 8kB 4 GiB (524288 × 8kB)

机制详解

effective_cache_size 是成本模型输入。数值越高,索引扫描看起来越有吸引力;数值越低,顺序扫描越有吸引力。

估算时应同时考虑 shared_buffers 与操作系统页缓存中可能用于 PostgreSQL 数据的部分,也要考虑二者内容重叠,以及多个并发查询共同争用缓存容量。

修改此参数不会改变 PostgreSQL 共享内存大小、不会预留内核缓存,也不保证页面在查询之间持续驻留;它只通过执行计划选择间接生效。

调优建议

提示

Advice。 以下建议是工作负载起点,必须用真实测量验证。

场景 建议
OLTP 估算扣除操作系统和同机服务后 PostgreSQL 实际可用的缓存,再用 EXPLAIN 验证索引密集型计划。不要照搬并发与工作集完全不同的主机百分比。
OLAP 大扫描会驱逐或争用缓存,因此不能把已安装内存直接等同于单条分析查询可用缓存;应结合代表性的混合负载与冷缓存测试校准。
小规格 为操作系统与其他服务留出空间;共享的小主机若把它设置为接近总内存,通常会高估缓存。始终把它当规划器估计值,而不是内存目标。

Pigsty 取值

以下值来自固定 8 核、32 GiB、100 GiB SSD 夹具,并按 PG19 Beta 3 渲染当前 Pigsty 模板;这不表示 Pigsty 当前支持该历史或测试版本。

模板 有效值 与上游 boot 比较 源表达式
OLTP 24576MB 不同于 boot 值 {{ pg_effective_cache_size }}MB
OLAP 24576MB 不同于 boot 值 {{ pg_effective_cache_size }}MB
CRIT 24576MB 不同于 boot 值 {{ pg_effective_cache_size }}MB
TINY 24576MB 不同于 boot 值 {{ pg_effective_cache_size }}MB
注意

Advice — 待人工复核。 当前 Pigsty 模板投影事实:OLTP: PG9.0–19 Beta 3 = 24576MB (dcs);OLAP: PG9.0–19 Beta 3 = 24576MB (dcs);CRIT: PG9.0–19 Beta 3 = 24576MB (dcs);TINY: PG9.0–19 Beta 3 = 24576MB (dcs)。 建议(待人工复核)——编辑推断:把该余量作为规划器有效缓存估计是一项简化,需要结合实际 OS 缓存、内容重叠、同机服务与查询并发复核。

常见坑

  • 期待该设置实际分配或预留内存。
  • 不扣除 PostgreSQL 缓存无法使用的内存,直接设置为整机 RAM。
  • 忽略访问不同数据集的并发查询会共享有效缓存。
  • 高估取值后,把过度偏向索引的计划误归因于其他成本参数。

shared_buffers · random_page_cost · seq_page_cost · effective_io_concurrency · max_connections

参考资料