我正在处理一些大数据,并且在查询中获取并行计划是必要的。我也很喜欢使用 CTE 来表达我的查询,但是根据 PostgreSQL 的文档,我不太确定 CTE 是否对并行性造成严重限制。
Here 、CTE 和临时表被标记为“并行受限”,其中“并行受限”定义为
A parallel restricted operation is one which cannot be performed in a parallel worker, but which can be performed in the leader while parallel query is in use.
Here ,就 CTE 而言,对并行限制的描述有点不同:
If a query contains a data-modifying operation either at the top level or within a CTE, no parallel plans for that query will be generated.
就我而言,我没有任何数据修改操作。
CTE 会在多大程度上限制我的并行计划的质量(如果有的话)?
公平地说,我在理解第一个定义的含义时遇到了一些困难。由于 CTE 可以具体化为临时表,因此我确信这种影响更加相关。第二个定义表明 CTE 并行性限制仅与数据修改操作相关。
最佳答案
使用 CTE 很好,并且在大多数情况下不会妨碍并行执行。
限制是 CTE 处于并行领导进程的私有(private)进程状态中,因此并行工作进程无法扫描它。除此之外,PostgreSQL 会很乐意生成一个并行计划。
所以要避免的事情可能是这样的查询
WITH a AS (SELECT ...)
SELECT ... FROM a JOIN b ...
如果您希望联接并行化。 CTE 内部的查询可以并行化(我认为),扫描 b
也可以并行化。
为了获得最佳并行化,您可以尝试将查询重写为
SELECT ...
FROM (SELECT ...) AS a
JOIN b ...
关于postgresql - 与 PostgreSQL CTE 的一般并行性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58442561/