PostgreSQL 在多大程度上支持并行 DDL?

Posted

技术标签:

【中文标题】PostgreSQL 在多大程度上支持并行 DDL?【英文标题】:To what degree does PostgreSQL support parallel DDL? 【发布时间】:2020-02-21 17:02:39 【问题描述】:

查看here,很明显Oracle 支持与明确列出的场景并行执行DDL 命令。我想知道 Postgres 是否确实提供了这样的功能?我可以找到很多关于 PostgreSQL 的“并行查询”的材料,但在涉及 DDL 时就没有那么多了。

例如,我可以并行执行多个'CREATE TABLE...AS SELECT'吗?如果没有,我怎样才能实现这样的功能?如果我有一个临时表 (CREATE TEMP TABLE),会发生什么?我需要为锁配置一些东西吗?

【问题讨论】:

这些是索引重建,而不仅仅是任何类型的 DDL。它们可以并行化。 CREATE TABLE 不需要并行化,例如,它是元数据操作。 CREATE .. AS SELECT 是 DML 的一半,该查询可以并行化。 "我可以并行执行多个 'CREATE TABLE...AS SELECT'" - 当然可以(只要它们不创建同一个表)。 ParallelConcurrent 是两个完全不同的东西。 Parallel 表示使用多个 CPU/线程在单个操作中处理大量数据。 Concurrent 表示同时进行多项操作。 @PanagiotisKanavos 为什么要强调并发和并行之间的区别? @Zeruno 因为它很重要很多。如果您想让索引重建或从结果创建表更快,您正在寻找并行化,而不是并发。您不能通过手动运行 4 或 8 个 INSERT 操作来加快 INSERT,例如,它们最终会相互阻塞。 【参考方案1】:

来自here:

即使通常可以生成并行查询计划,如果满足以下任一条件,规划器也不会为给定查询生成它们:

查询写入任何数据或锁定任何数据库行。如果查询在顶层或内部包含数据修改操作 一个 CTE,不会为该查询生成并行计划。

(强调我的)。

这似乎表明 Postgres 在任何情况下都不会“并行化”任何修改数据库结构的查询。

在 Postgres requires one connection per running query 中同时运行多个查询。

【讨论】:

这仅适用于 DML。 OP 问题中的操作是 可以 并行化的索引操作。在CREATE INDEX 的Notes 部分检查Parallel Index Build @PanagiotisKanavos:听起来像是一个好的答案的开始。【参考方案2】:

这些是通用的 DDL 语句,它们是索引操作和分区操作,可以并行化。

如果您检查CREATE INDEX 语句的Notes 部分,您会看到支持并行索引构建:

PostgreSQL 可以在利用多个 CPU 的同时构建索引,以便更快地处理表行。此功能称为并行索引构建。对于支持并行构建索引的索引方法(目前只有 B-tree),maintenance_work_mem 指定了每个索引构建操作作为一个整体可以使用的最大内存量,而不管启动了多少个工作进程。通常,成本模型会自动确定应请求多少工作进程(如果有)。

更新

我怀疑真正的问题是关于CREATE TABLE ... AS

这本质上是一个CREATE TABLE,后跟一个INSERT .. SELECTCREATE TABLE 部分不能并行化,也不必 - 它本质上是元数据操作。另一方面,SELECT 可以轻松并行化。 INSERT 有点难,但这是实现的问题。

正如a_horse_with_no_name 在a comment to this question 中解释的那样,CREATE TABLE AS 的并行化已在PostgreSQL 11 中添加:

对并行性的改进,包括:

CREATE INDEX 现在可以在构建 B 树索引时使用并行处理 现在可以在 CREATE TABLE ... AS、CREATE MATERIALIZED VIEW 和某些使用 UNION 的查询中实现并行化 并行化哈希连接和并行化顺序扫描现在性能更好

【讨论】:

以上是关于PostgreSQL 在多大程度上支持并行 DDL?的主要内容,如果未能解决你的问题,请参考以下文章

给出 SIGTERM 后,在多大程度上可以依赖写入磁盘?

Selenium WebDriver:我可以在多大程度上依赖 JavaScript?

您可以在多大程度上自定义 Fabric 的 Digits 在 Android 上的流程、外观和感觉?

ImageMagick 在将 PSD 文件转换为 GIF、PNG、JPG 文件时可以在多大程度上保留剪切路径?

损失函数

.神经网络的学习—损失函数