拉迪姆·马雷克:好的CTE,坏的CTE

拉迪姆·马雷克:好的CTE,坏的CTE

💡 原文英文,约5100词,阅读约需19分钟。
📝

内容提要

PostgreSQL 12引入了CTE(公用表表达式)的内联优化,改变了CTE的处理方式。CTE根据引用次数和副作用进行处理,单次引用且无副作用的CTE会被内联,从而提高查询性能。物化CTE在多次引用或包含数据修改操作时仍然有用。PostgreSQL 17和18进一步改善了CTE的统计信息传播和内存使用监控,使得CTE的使用更加高效。

🎯

关键要点

  • PostgreSQL 12引入了CTE的内联优化,改变了CTE的处理方式。

  • 单次引用且无副作用的CTE会被内联,从而提高查询性能。

  • 物化CTE在多次引用或包含数据修改操作时仍然有用。

  • PostgreSQL 17和18进一步改善了CTE的统计信息传播和内存使用监控。

  • CTE在PostgreSQL 12之前被视为优化障碍,无法进行索引使用和谓词推送。

  • PostgreSQL 12后,CTE可以根据引用次数和副作用进行内联或物化处理。

  • 递归CTE和数据修改CTE始终会被物化,以确保副作用的可预测性。

  • PostgreSQL 17引入了列统计信息传播,改善了物化CTE的估算准确性。

  • CTE的使用应根据具体情况选择内联或物化,以优化性能。

🔎

延伸解读

CTE的优化演变

PostgreSQL 12之前,CTE被视为优化障碍,无法进行索引使用和谓词推送。随着PostgreSQL 12引入内联优化,CTE的处理方式发生了根本变化。开发者应了解CTE的引用次数和副作用对性能的影响,以便在查询中做出更明智的选择。

物化CTE的使用场景

物化CTE在多次引用或包含数据修改操作时仍然有用。尽管内联CTE在性能上更优,但在某些情况下,物化CTE可以避免重复计算,尤其是在处理复杂查询时。开发者应根据具体情况选择合适的CTE类型。

统计信息传播的改进

PostgreSQL 17引入了列统计信息传播,改善了物化CTE的估算准确性。这意味着在使用物化CTE时,开发者可以获得更可靠的查询计划,减少因估算不准确导致的性能问题。了解这一点有助于优化查询性能。

延伸问答

PostgreSQL 12引入的CTE内联优化有什么影响?

PostgreSQL 12引入的CTE内联优化使得单次引用且无副作用的CTE可以被内联,从而提高查询性能,避免了之前CTE作为优化障碍的问题。

什么情况下CTE会被物化?

CTE会在多次引用、包含数据修改操作或使用递归时被物化,以确保副作用的可预测性。

PostgreSQL 17对CTE的改进有哪些?

PostgreSQL 17改善了CTE的统计信息传播和内存使用监控,使得CTE的使用更加高效。

如何选择使用内联还是物化的CTE?

选择内联或物化的CTE应根据具体情况,内联适合单次引用且无副作用的CTE,而物化适合多次引用或需要副作用的CTE。

CTE在PostgreSQL 12之前被视为优化障碍的原因是什么?

在PostgreSQL 12之前,CTE被视为优化障碍,因为规划器无法推送谓词到CTE内部,导致无法利用索引。

递归CTE的处理方式是什么?

递归CTE始终会被物化,以维护迭代过程中的工作表,确保副作用的可预测性。

🏷️

标签

➡️

继续阅读