首页/数据/SQL 速查/PG 计划相关参数速览
性能与执行计划72 条

PG 计划相关参数速览

work_mem、random_page_cost、effective_cache_size 影响计划选择:按实例与存储特性调整,enable_* 仅用于诊断。

SQL 速查数据更新于 2026-10-13

影响计划选择的参数

优化器按代价挑计划,代价模型里的几个参数直接决定它偏向索引还是全表扫描、偏向把中间结果放内存还是落盘。内存类参数按每个排序或哈希节点单独分配,因此单条语句调大很有效,全局调大要算并发账。另有一组开关只用于诊断对比:把某种访问方式临时关掉,看计划会变成什么样,用来看清代价模型的判断依据,不适合长期生效。

基本信息

适用平台PostgreSQL 12 及以上
内存类参数排序与哈希每个节点可用的内存上限
随机读代价估算随机页读取的相对成本,存储介质差异大
缓存规模提示只作为优化器参考,不实际分配内存
诊断开关临时禁用某种访问方式,仅用于对比分析

典型使用场景

  • 排序落盘:计划里出现外部归并排序时,评估提高内存上限的效果
  • 哈希连接分批:大表连接时哈希表超出内存导致落盘,需要针对性调整
  • 存储介质升级后:固态盘上随机读代价变低,需重新评估随机读参数
  • 会话级调试:用语句级设置验证参数影响,再决定是否落到实例配置
  • 遗留参数审计:清理历史上为了临时救火长期生效的开关

参数调整与验证

参数调整与验证
-- 会话级验证:只影响当前连接,不污染实例配置
SET work_mem = '64MB';
EXPLAIN (ANALYZE, BUFFERS)
SELECT user_id, SUM(amount) FROM orders GROUP BY user_id;
RESET work_mem;                     -- 验证完立刻恢复

-- 落盘排序在输出里会体现出来,例如出现外部归并排序并给出占用大小
-- Sort Method: external merge  Disk: 24576kB

-- 查看当前连接里的生效值
SHOW work_mem;
SHOW random_page_cost;
SHOW effective_cache_size;

-- 调整统计信息精度,让估算更贴近真实分布
ALTER TABLE orders ALTER COLUMN user_id SET STATISTICS 500;

参数作用速览

参数类别作用使用建议
排序与哈希内存每个节点可用的内存上限按会话或语句调,全局调大要评估并发
随机读代价估算随机访问一页的相对成本固态盘环境可下调,改前先做基准对比
缓存规模提示告诉优化器可用的缓存量不分配内存,按实例实际内存比例设置
统计信息精度单列统计的采样粒度分布倾斜的列可以提高精度
诊断开关临时禁用某类访问方式只用于对比验证,验证完立即恢复
内存类参数是按节点分配的:一条语句里有多个排序与哈希节点时,实际占用是节点数乘以参数值,再乘以并发连接数。全局调大之前先把这三个因子算一遍。
长期关闭某类访问方式的开关会让代价模型形同虚设:计划看起来符合预期,实际绕过了优化器的正常判断,一旦遇到数据分布变化就会崩掉。急救时用可以,事后必须回收。

易错点

  • 把内存参数全局调大:按每个节点、每个连接分配,高并发下内存压力陡增,可能触发系统级内存不足
  • 长期保留诊断开关,代价模型被绕过,计划质量不可控
  • 只改参数不做前后对比:没有基准就无法判断改动是否有收益,可能越调越差
  • 忽略统计信息精度:分布倾斜的列估算严重失真,调再多内存参数也没用
  • 在实例级直接改参数并且不记录:后续排查计划突变时缺少变更线索

数据来源与参考

  • PostgreSQL Documentation §19.7 Query Planning
  • PostgreSQL Documentation §14.2 Statistics Used by the Planner
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌