Postgresql 什么是CTE扫描,它对性能有什么影响?

Postgresql 什么是CTE扫描,它对性能有什么影响?,postgresql,Postgresql,我正在尝试使用EXPLAIN-ANALYZE诊断一个缓慢的查询。我不熟悉这个命令,所以我读过。查询计划使用CTE扫描,但与顺序扫描相比,我不知道这是什么,更重要的是,CTE扫描对查询性能的总体意义。CTE扫描是对CTE术语的物化结果的顺序扫描,一个命名部分,如CTE中的blah,如blah,如SELECT 物化意味着PostgreSQL已经计算了结果,并将其转换为一个临时行存储,而不仅仅是像视图一样使用CTE 其主要含义是,从CTE术语中选择一个小子集并丢弃其余部分可能会浪费大量工作,因为您丢弃

我正在尝试使用EXPLAIN-ANALYZE诊断一个缓慢的查询。我不熟悉这个命令,所以我读过。查询计划使用CTE扫描,但与顺序扫描相比,我不知道这是什么,更重要的是,CTE扫描对查询性能的总体意义。

CTE扫描是对CTE术语的物化结果的顺序扫描,一个命名部分,如CTE中的blah,如blah,如SELECT

物化意味着PostgreSQL已经计算了结果,并将其转换为一个临时行存储,而不仅仅是像视图一样使用CTE

其主要含义是,从CTE术语中选择一个小子集并丢弃其余部分可能会浪费大量工作,因为您丢弃的部分仍然必须完全计算


有关详细信息,请参见。

这是一个高级主题,我想不出外行的解释。请参阅-请相信optmizer,它肯定没有seqscan那么糟糕。它的糟糕程度可能取决于数据基数。显示您的查询和/或解释结果。PostgreSQL 12具有自动、可重写的内联功能,使用x作为[未]物化,可能会提高此类查询的性能。@craigringer非常感谢您。那篇文章正是我理解这个问题所需要的。你节省了我这么多时间!