💡 原文英文,约2100词,阅读约需8分钟。
📝

内容提要

在Postgres中,不同的plan_cache_mode设置对分区表的锁行为影响显著。默认模式下,执行第六次时会出现锁爆炸,需锁定所有关系。强制使用通用计划时,首次执行锁定52个关系,后续执行锁定所有分区。强制使用自定义计划则每次执行仅需8个锁。选择应根据工作负载和锁竞争情况,未来可能有优化。

🎯

关键要点

  • 在Postgres中,不同的plan_cache_mode设置对分区表的锁行为影响显著。
  • 默认模式下,第六次执行时会出现锁爆炸,需锁定所有关系。
  • 强制使用通用计划时,首次执行锁定52个关系,后续执行锁定所有分区。
  • 强制使用自定义计划则每次执行仅需8个锁。
  • 选择应根据工作负载和锁竞争情况,未来可能有优化。
  • 在空表情况下,Postgres在第六次执行后切换到通用计划,但在有数据的情况下,通用计划的成本过高,因此继续使用自定义计划。
  • 使用force_generic_plan时,首次执行会导致52个锁,后续执行锁定所有分区。
  • 使用force_custom_plan时,每次执行都只需8个锁,但需要每次重新规划。
  • 在分区表中,规划开销可能比锁定开销更高,尤其是当分区数量较多时。
  • Amit Langote正在研究优化方案,以解决O(n)的执行锁获取问题,使得未来的force_generic_plan在分区表中更可行。
  • 当前版本中,用户需要根据具体情况选择使用force_custom_plan或force_generic_plan。
  • 准备语句与分区表的交互揭示了数据库优化中的一个基本悖论:针对一种场景优化的解决方案在另一种场景中可能变成问题。
➡️

继续阅读