3

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

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

4

2 回答 2

1

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

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

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

更新

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

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

正如对此问题的评论中a_horse_with_no_name所解释的,在PostgreSQL 11中添加了并行化:CREATE TABLE AS

并行性的改进,包括:

  • CREATE INDEX 现在可以在构建 B 树索引时使用并行处理
  • 现在可以在 CREATE TABLE ... AS、CREATE MATERIALIZED VIEW 和某些使用 UNION 的查询中进行并行化
  • 并行化散列连接和并行化顺序扫描现在性能更好
于 2020-02-21T17:51:37.343 回答
1

这里

即使通常可以生成并行查询计划,如果以下任何一项为真,则计划程序也不会为给定查询生成它们:

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

(强调我的)。

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

在 Postgres 中同时运行多个查询需要每个运行查询一个连接

于 2020-02-21T17:23:03.733 回答