我正在处理一些大型数据,在查询中获得并行计划是必要的。我也非常喜欢使用CTE来表达我的查询,但是在PostgreSQL的文档之后,我不太确定CTE是否对并行性造成了严重的限制。
这里、CTEs和临时表被标记为“并行受限”,其中“并行受限”定义为
并行受限操作是不能在并行工作者中执行的操作,但在使用并行查询时可以在领导者中执行。
这里,对并行限制的描述在考虑CTE方面有一点不同:
如果查询包含顶级或CTE中的数据修改操作,则不会为该查询生成并行计划。
在我的例子中,我没有任何数据修改操作。
如果有的话,CTE会在多大程度上限制我的平行计划的质量?
公平地说,我很难理解第一个定义的含义。因为CTE可以作为临时表来实现,所以我确信这种影响更加重要。第二个定义表明,CTE并行性限制仅与数据修改操作有关。
发布于 2019-10-18 06:43:38
使用CTE很好,在大多数情况下不会妨碍并行执行。
限制是CTE生活在并行领导进程的私有进程状态中,因此并行工作人员不能扫描它。除此之外,PostgreSQL将很高兴地生成一个并行计划。
因此,要避免的事情可能是查询,例如
WITH a AS (SELECT ...)
SELECT ... FROM a JOIN b ...如果您希望连接被并行化。CTE内部的查询可以并行化(我认为),扫描b也可以并行化。
要实现最佳并行化,可以尝试将查询重写为
SELECT ...
FROM (SELECT ...) AS a
JOIN b ...https://stackoverflow.com/questions/58442561
复制相似问题