PostgreSQL 15.2中enable_memoize与并行查询冲突报错问题咨询
问题分析与结论
这确实是PostgreSQL 15.x版本中存在的已知bug,根源在于memoize优化特性与并行查询的交互逻辑缺陷。
问题背景
你的查询场景是CTE子查询关联分区表,且calendar和weather表已预加载到共享缓冲区:
with t as (select t.day from calendar where idtime between 20230101 and 20230224) select idcell, sum (tmean) from weather w join t on w.day = t.day group by idcell
不同参数组合的执行结果:
- 开启
enable_memoize+禁用并行(max_parallel_workers_per_gather=0):耗时1秒,正常执行 - 关闭
enable_memoize+开启并行(max_parallel_workers_per_gather=20):耗时39秒,正常执行 - 开启
enable_memoize+并行数≥2:报错ERROR: could not find memoization table entry
原因解释
Memoize是PostgreSQL 14引入的优化特性,用于缓存重复执行的子查询结果以提升性能。但在15.0-15.2版本中,并行worker进程尝试访问主进程创建的memoization表时,存在共享同步机制的漏洞,导致worker进程无法找到对应的缓存条目,触发上述错误。这个问题在涉及CTE、子查询关联分区表的场景中更容易复现。
解决办法
- 临时规避方案:
- 保持
max_parallel_workers_per_gather=0禁用并行,同时开启enable_memoize,维持1秒的查询性能 - 或者关闭
enable_memoize,使用并行查询(但性能会大幅下降)
- 保持
- 彻底修复方案:
升级到PostgreSQL 15.3或更高版本,官方已在该版本中修复了memoize与并行查询交互的bug,修复后可同时开启memoize和并行查询,兼顾性能与稳定性。
内容的提问来源于stack exchange,提问作者Tony Zucchini
相关产品推荐
相关产品推荐

