postgresql - 与 PostgreSQL CTE 的一般并行性

标签 postgresql parallel-processing query-optimization common-table-expression

我正在处理一些大数据,并且在查询中获取并行计划是必要的。我也很喜欢使用 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/

相关文章:

ruby-on-rails - 如何查看什么属性给我这个错误 : value too long for type character varying(255)

c++ - 与串行版本相比,使用openMP进行插入排序的并行化可提供非常醒目的结果

java-8 - 如何在链式 CompletableFuture 中扇出?

c - 多进程无锁

sql - 甲骨文 SQL : efficient way to calculate business days in a month

mysql - 如果我们通过同一字段的不同值进行搜索,可以在 SQL 查询中将 OR 替换为更短的条件吗

node.js - 如何使用 Node JS 设置 Babel 6 以在我的服务器端代码中使用 ES6?

sql - 如何选择多个现有的列名并将其分组为 1 列?

mysql - 优化mysql最新时间戳查询

postgresql - 优化时间戳范围的 Postgres 查询