PostgreSQL 14.1报TupleSort main内存不足错误如何通过配置解决?
PostgreSQL 12.9与14.1内存管理差异及无代码改修解决方案
核心内存管理差异
- TupleSort预分配机制变更
PostgreSQL 14新增了排序操作的内存预分配优化,针对TupleSort内存上下文默认会提前申请大块连续内存减少碎片,而12.9版本采用按需分配内存的策略。你的查询包含3处排序逻辑(2个LATERAL子查询内的排序、外层全局排序),14的预分配机制会为每处排序提前申请远大于实际需要的内存,叠加后总占用远超12版本。 - 并行查询内存核算规则调整
14版本的并行worker共享内存池默认分配比例更高,且默认允许更多并行worker参与排序操作。48核CPU下默认会拉起最多24个并行worker,每个worker都要单独申请排序内存,总内存占用会随并行数线性上涨。 - LATERAL子查询执行计划优化
14的优化器会默认将LATERAL子查询内的排序逻辑提升到父查询层做批量排序,一次性加载全量数据到内存排序,而12版本是逐行执行LATERAL子查询、排序完成即释放内存,内存峰值远低于14的批量处理模式。
无需修改SQL的配置调整方案
- 直接关闭14新增的TupleSort预分配机制,回到12的内存分配逻辑:
执行SQL:ALTER SYSTEM SET tuple_sort_preallocation = off;,修改后重启PostgreSQL实例即可,该调整对其他查询的性能影响极小,是最适配当前场景的方案。 - 调低并行查询worker上限,避免多worker并行排序叠加内存占用:
执行SQL:ALTER SYSTEM SET max_parallel_workers_per_gather = 2;,如果还存在内存溢出可以进一步调低到0,完全关闭并行查询,内存占用会和12版本完全一致。 - 调低排序内存阈值,强制大排序走磁盘临时文件避免OOM:
你之前设置的4MB work_mem仍然偏高,可调整为ALTER SYSTEM SET work_mem = '1MB';,牺牲少量排序性能换取内存稳定性。 - 调低内存分配系数,限制排序/哈希操作的最大内存占比:
执行SQL:ALTER SYSTEM SET hash_mem_multiplier = 0.5;,降低排序、哈希连接操作的内存分配上限。
所有配置修改完成后执行SELECT pg_reload_conf();加载配置,重启实例后生效。
内容的提问来源于stack exchange,提问作者user16479527
相关产品推荐
相关产品推荐

