effective_cache_size
规划器对单条查询可用 PostgreSQL 数据缓存规模的估计;它影响成本计算,但不会分配内存。
说明
Fact — 官方简述译文:设置规划器对有效数据缓存总规模的假设。
身份
生命周期
| Fact | 值 |
|---|---|
| 首次观测 | PG9.0(研究下界) |
| 在档版本 | PG9.0–19 Beta 3 |
| 移除版本 | 否 |
| 引入提交 | 不作断言:早于 PG9.0 研究边界 |
| 提交日期 | — |
| Discussion | — |
默认值变迁
| 版本 | 原始 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
参考资料
- PostgreSQL 19 Beta 3 — effective_cache_size
- PostgreSQL 18:使用 EXPLAIN
- Pigsty:参数优化策略
- PostgreSQL 19 发行说明
- 机器可读 GUC 全量导出