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'" - 当然可以(只要它们不创建同一个表)。
Parallel
和 Concurrent
是两个完全不同的东西。 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 .. SELECT
。 CREATE 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?的主要内容,如果未能解决你的问题,请参考以下文章
Selenium WebDriver:我可以在多大程度上依赖 JavaScript?
您可以在多大程度上自定义 Fabric 的 Digits 在 Android 上的流程、外观和感觉?