理查德·燕:plan_cache_mode的隐秘行为

💡 原文英文,约1100词,阅读约需4分钟。
📝

内容提要

PostgreSQL的查询规划器在执行预处理语句时,前五次使用自定义计划,第六次可能切换到通用计划。这种切换可能导致性能下降,特别是在数据分布不均时。用户应注意这一行为,并在必要时强制使用自定义计划以优化性能。

🎯

关键要点

  • PostgreSQL的查询规划器在执行预处理语句时,前五次使用自定义计划。
  • 第六次执行时,规划器可能会切换到通用计划,这可能导致性能下降。
  • 自定义计划是基于实际参数值生成的,适合特定执行,但每次都需要规划开销。
  • 通用计划是在不知道具体参数值的情况下规划的,节省了规划开销。
  • 在数据分布不均的情况下,切换到通用计划可能会显著影响性能。
  • 用户可以通过设置plan_cache_mode为force_custom_plan来强制使用自定义计划,以优化性能。

延伸问答

PostgreSQL的查询规划器如何处理预处理语句的执行计划?

查询规划器在前五次执行时使用自定义计划,第六次可能切换到通用计划。

什么是自定义计划和通用计划,它们有什么区别?

自定义计划基于实际参数值生成,适合特定执行;通用计划则在不知道具体参数值的情况下规划,节省规划开销。

为什么在数据分布不均的情况下,切换到通用计划会影响性能?

在数据分布不均时,通用计划可能导致不适合的执行策略,从而显著影响性能。

如何强制PostgreSQL使用自定义计划以优化性能?

用户可以通过设置plan_cache_mode为force_custom_plan来强制使用自定义计划。

在执行预处理语句时,为什么第六次执行会切换计划?

第六次执行时,规划器会比较前五次自定义计划的平均成本与通用计划的估计成本,如果通用计划更便宜,则切换。

如果发现预处理语句的性能下降,应该如何排查?

可以检查该语句是否被调用超过五次,或尝试设置plan_cache_mode为force_custom_plan进行排查。

➡️

继续阅读