尼古拉·萨莫赫瓦洛夫:#PostgresMarathon 2-011:预编译语句与分区表——悖论,第三部分

尼古拉·萨莫赫瓦洛夫:#PostgresMarathon 2-011:预编译语句与分区表——悖论,第三部分

💡 原文英文,约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。
  • 准备语句与分区表的交互揭示了数据库优化中的一个基本悖论:针对一种场景优化的解决方案在另一种场景中可能变成问题。

延伸问答

Postgres中的plan_cache_mode设置对分区表有什么影响?

不同的plan_cache_mode设置会显著影响分区表的锁行为,尤其是在执行第六次时可能导致锁爆炸。

使用force_generic_plan和force_custom_plan有什么区别?

使用force_generic_plan时,首次执行会导致52个锁,而后续执行只需13个锁;使用force_custom_plan时,每次执行仅需8个锁,但需要重新规划。

在分区表中,为什么会出现锁爆炸现象?

锁爆炸现象发生在执行第六次时,Postgres需要锁定所有关系以评估通用计划的成本,导致需要52个锁。

如何选择适合的plan_cache_mode?

选择应根据工作负载和锁竞争情况,如果锁竞争严重,可以考虑使用force_custom_plan以避免锁爆炸。

Amit Langote正在研究什么优化方案?

Amit Langote正在研究一种优化方案,以解决O(n)的执行锁获取问题,使得未来的force_generic_plan在分区表中更可行。

在分区表中,规划开销和锁定开销哪个更高?

在分区表中,规划开销可能比锁定开销更高,尤其是当分区数量较多时。

➡️

继续阅读