【问题标题】:To what degree does PostgreSQL support parallel DDL?PostgreSQL 在多大程度上支持并行 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,例如,它们最终会相互阻塞。

标签: postgresql ddl create-table postgresql-12 postgresql-parallel-query


【解决方案1】:

来自here

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

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

(强调我的)。

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

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

【讨论】:

  • 这仅适用于 DML。 OP 问题中的操作是 可以 并行化的索引操作。在CREATE INDEXNotes 部分检查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_namea comment to this question 中解释的那样,CREATE TABLE AS 的并行化已在PostgreSQL 11 中添加:

对并行性的改进,包括:

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

【讨论】:

    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2016-08-20
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多