PostgreSQL 的 plan_cache_mode=auto 会先执行五次自定义计划,第六次若通用计划估算成本更低则切换。对拥有 80 万订单的大租户,通用计划误估为 216 行,改用嵌套循环并触发 320 万次缓冲命中,查询从 274 毫秒骤增至 2319 毫秒。单次 EXPLAIN 无法发现,需在同一连接重复运行并保留每次计划。修复方法是设置 plan_cache_mode=force_custom_plan。
在Postgres中,不同的plan_cache_mode设置对分区表的锁行为影响显著。默认模式下,执行第六次时会出现锁爆炸,需锁定所有关系。强制使用通用计划时,首次执行锁定52个关系,后续执行锁定所有分区。强制使用自定义计划则每次执行仅需8个锁。选择应根据工作负载和锁竞争情况,未来可能有优化。
完成下面两步后,将自动完成登录并继续当前操作。