选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

文档 / 配置参数 / 查询规划

CONFIGURATION PARAMETER查询规划 / 规划器代价常量

effective_cache_size

设置规划器对有效数据缓存总规模的假设。

Sets the planner's assumption about the total size of the data caches.

整数 会话 引入 9.0(基线) 现存至 20 devel 1 次默认值变更

类型
整数integer
上下文
会话任何用户都可在会话内用 SET 修改
默认值
4 GiB (524288 × 8kB)原始值 524288 8kB
取值范围
1 – 2147483647
引入版本
9.0(基线)
状态
现存

PostgreSQL 18 手册 官方文档

版本轨迹

相对 PostgreSQL 17 无变化。

默认值变迁

128 MiB (16384 × 8kB) 9.0 – 9.3 4 GiB (524288 × 8kB) 9.4 – 20

默认值一共换过 2 档,每段的宽度按它覆盖的大版本数伸展,深色的一段是当前查看的 PostgreSQL 18。带单位的取值换算成了可读形式,原始的 boot_val 与单位写在悬浮提示里。

手册说明

PostgreSQL 18 手册 · 19.7 查询规划 本站手册 官方原文

本版译文与 PostgreSQL 12 完全一致,下面就是同一段文字。

设置规划器对一个单一查询可用的有效磁盘缓冲区尺寸的假设。 这个参数会被考虑在使用一个索引的代价估计中,更高的数值会使得索引扫描更可能被使用,更低的数值会使得顺序扫描更可能被使用。 在设置这个参数时,你还应该考虑PostgreSQL的共享缓冲区以及将被用于PostgreSQL数据文件的内核磁盘缓冲区,尽管有些数据可能在两个地方都存在。 另外,还要考虑预计在不同表上的并发查询数目,因为它们必须共享可用的空间。 这个参数对PostgreSQL分配的共享内存尺寸没有影响,它也不会保留内核磁盘缓冲,它只用于估计的目的。系统也不会假设在查询之间数据会保留在磁盘缓冲中。 如果指定值时没有单位,则以块为单位,即BLCKSZ字节,通常为8kB。 默认值是 4吉字节(4GB)。(如果BLCKSZ不是8kB,默认值会按比例缩放它。)

机制详解

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

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

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

调优建议

按典型负载给出的取值思路,不是放之四海皆准的配方:实际取值要看数据量、并发度与硬件。

  • OLTP在线事务处理

    估算扣除操作系统和同机服务后 PostgreSQL 实际可用的缓存,再用 EXPLAIN 验证索引密集型计划。不要照搬并发与工作集完全不同的主机百分比。

  • OLAP分析与批处理

    大扫描会驱逐或争用缓存,因此不能把已安装内存直接等同于单条分析查询可用缓存;应结合代表性的混合负载与冷缓存测试校准。

  • 小规格低配实例与开发机

    为操作系统与其他服务留出空间;共享的小主机若把它设置为接近总内存,通常会高估缓存。始终把它当规划器估计值,而不是内存目标。

常见问题

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

演化历史

相邻两个大版本之间的差异,新的在前。版本号链到该版的快照。

  1. PostgreSQL 20 ← 19 沿用 19

    事实沿用 19

  2. PostgreSQL 9.4 ← 9.3 默认值变更

    默认值 128 MiB (16384 × 8kB) 4 GiB (524288 × 8kB) 简述 Sets the planner's assumption about the size of the data cache. Sets the planner's assumption about the total size of the data caches. 补充说明 That is, the size of the cache used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each. That is, the total size of the caches (kernel cache and shared buffers) used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each.

  3. PostgreSQL 9.3 ← 9.2 仅描述更新

    简述 Sets the planner's assumption about the size of the disk cache. Sets the planner's assumption about the size of the data cache. 补充说明 That is, the portion of the kernel's disk cache that will be used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each. That is, the size of the cache used for PostgreSQL data files. This is measured in disk pages, which are normally 8 kB each.

逐版本快照

每个收录版本里的 7 项事实,与上一个存在的版本不同的格子带底色。版本号链到该版。

版本 默认值单位上下文类型最小值最大值枚举值
9.0 128 MiB (16384 × 8kB) 8kB 会话 整数 1 2147483647
9.1 128 MiB (16384 × 8kB) 8kB 会话 整数 1 2147483647
9.2 128 MiB (16384 × 8kB) 8kB 会话 整数 1 2147483647
9.3 128 MiB (16384 × 8kB) 8kB 会话 整数 1 2147483647
9.4 4 GiB (524288 × 8kB) 8kB 会话 整数 1 2147483647
9.5 4 GiB (524288 × 8kB) 8kB 会话 整数 1 2147483647
9.6 4 GiB (524288 × 8kB) 8kB 会话 整数 1 2147483647
10 4 GiB (524288 × 8kB) 8kB 会话 整数 1 2147483647
11 4 GiB (524288 × 8kB) 8kB 会话 整数 1 2147483647
12 4 GiB (524288 × 8kB) 8kB 会话 整数 1 2147483647
13 4 GiB (524288 × 8kB) 8kB 会话 整数 1 2147483647
14 4 GiB (524288 × 8kB) 8kB 会话 整数 1 2147483647
15 4 GiB (524288 × 8kB) 8kB 会话 整数 1 2147483647
16 4 GiB (524288 × 8kB) 8kB 会话 整数 1 2147483647
17 4 GiB (524288 × 8kB) 8kB 会话 整数 1 2147483647
18 4 GiB (524288 × 8kB) 8kB 会话 整数 1 2147483647
19 4 GiB (524288 × 8kB) 8kB 会话 整数 1 2147483647
20 沿用 4 GiB (524288 × 8kB) 8kB 会话 整数 1 2147483647

参考资料

同类参数

参数 类型 上下文 默认值 版本变动 最近变更
Query Tuning 查询规划 15 个
规划器代价常量 15
cpu_index_tuple_cost 浮点 会话 0.005
设置规划器处理每个索引条目的成本估计。 现存
cpu_operator_cost 浮点 会话 0.0025
设置规划器执行每个操作符或函数调用的成本估计。 现存
cpu_tuple_cost 浮点 会话 0.01
设置规划器处理每个元组(行)的成本估计。 现存
effective_cache_size 整数 会话 4 GiB (524288 × 8kB) 9.41 次
设置规划器对有效数据缓存总规模的假设。 现存
jit_above_cost 浮点 会话 100000
设置启用 JIT 编译的查询成本阈值。 现存
jit_inline_above_cost 浮点 会话 500000
设置 JIT 尝试内联的查询成本阈值。 现存
jit_optimize_above_cost 浮点 会话 500000
设置 JIT 执行昂贵优化的查询成本阈值。 现存
min_eager_agg_group_size 浮点 会话 8
设置考虑提前聚合所需的最小平均分组大小。 现存
min_parallel_index_scan_size 整数 会话 512 KiB (64 × 8kB)
设置考虑并行索引扫描所需的最小索引数据量。 现存
min_parallel_relation_size 整数 会话 8 MiB (1024 × 8kB)
设置可考虑并行扫描的关系最小尺寸。 于 10 移除
min_parallel_table_scan_size 整数 会话 8 MiB (1024 × 8kB)
设置考虑并行表扫描所需的最小表数据量。 现存
parallel_setup_cost 浮点 会话 1000
设置规划器启动并行工作进程的成本估计。 现存
parallel_tuple_cost 浮点 会话 0.1
设置把每行从并行 worker 传给 leader 的成本估计。 现存
random_page_cost 浮点 会话 4
设置规划器对非顺序读取页面的相对成本估计。 现存
seq_page_cost 浮点 会话 1
设置规划器顺序读取磁盘页面的成本估计。 现存