PostgreSQL 12 CTE 物化选项何时提供优化优势?

Zer*_*uno 5 postgresql common-table-expression postgresql-12

编辑:我已将这个问题移至 ,因为dba.stackexchange我收到了建议,认为该社区可以更好地解决我的问题。

我一直在阅读有关 PostgreSQL 的新 CTE 功能 - MATERIALIZED 或 NOT MATERIALIZED 关键字 - 它可以在某些情况下提供额外的优化机会,前提是这样做是安全的。对此PostgreSQL 更新的评论如下:

...用户可以通过指定 MATERIALIZED 强制旧行为 [LESS OPTIMIZED];当查询故意使用WITH作为优化栅栏以防止计划选择不当时,这主要有用。

我一直想知道,考虑到在某种情况下使用 CTE 优化(不是 MATERIALIZED 关键字)是安全的,在这种情况下,优化程度较低的“MATERIALIZED”关键字可以“防止错误的计划选择”,如引用所述或提供更好的计划?

ste*_*eve 1

它指的是内联子查询可能会导致查询速度变慢,而 CTE(作为优化栅栏运行可以避免这种情况)。这是一个错误示例。