影响计划选择的参数
优化器按代价挑计划,代价模型里的几个参数直接决定它偏向索引还是全表扫描、偏向把中间结果放内存还是落盘。内存类参数按每个排序或哈希节点单独分配,因此单条语句调大很有效,全局调大要算并发账。另有一组开关只用于诊断对比:把某种访问方式临时关掉,看计划会变成什么样,用来看清代价模型的判断依据,不适合长期生效。
基本信息
| 适用平台 | 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;参数作用速览
| 参数类别 | 作用 | 使用建议 |
|---|---|---|
| 排序与哈希内存 | 每个节点可用的内存上限 | 按会话或语句调,全局调大要评估并发 |
| 随机读代价 | 估算随机访问一页的相对成本 | 固态盘环境可下调,改前先做基准对比 |
| 缓存规模提示 | 告诉优化器可用的缓存量 | 不分配内存,按实例实际内存比例设置 |
| 统计信息精度 | 单列统计的采样粒度 | 分布倾斜的列可以提高精度 |
| 诊断开关 | 临时禁用某类访问方式 | 只用于对比验证,验证完立即恢复 |
内存类参数是按节点分配的:一条语句里有多个排序与哈希节点时,实际占用是节点数乘以参数值,再乘以并发连接数。全局调大之前先把这三个因子算一遍。
长期关闭某类访问方式的开关会让代价模型形同虚设:计划看起来符合预期,实际绕过了优化器的正常判断,一旦遇到数据分布变化就会崩掉。急救时用可以,事后必须回收。