内容提要
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始终会被物化,以维护迭代过程中的工作表,确保副作用的可预测性。