Code前端首页关于Code前端联系我们

PostgreSQL11新特性支持并行索引创建(仅限B树索引)

terry 2年前 (2023-09-26) 阅读数 45 #数据库

PostgreSQL 11版本在并行方面进行了改进,比如支持并行索引创建、并行hash Join、并行CREATE TABLE.. AS等。本文首先介绍并行索引。

PostgreSQL 版本 11 仅支持 B 树索引以进行并行索引创建。现阶段不支持并行创建其他类型的索引。

并行进程相关参数

在介绍并行索引之前,我们先了解一下并行进程相关参数。参数

  • max_parallel_maintenance_workers

max_parallel_maintenance_workers 设置维护命令(例如 CREATE INDEX)

允许的最大并行进程数。默认值为2。

  • max_parallel_workers

设置系统支持的最大并行进程数。默认值为 8。

  • max_worker_processes

设置数据库后台进程的最大数量。默认值为 8。

  • max_parallel_workers_per_gather

设置单个 Gather 或 Gather Merge 节点可以启用的最大并行进程数。默认值为2。

并行查询(Parallel Query)的并行度受此参数影响。 CREATE INDEX 语句的并行度不受此参数影响。

以上参数可能不太好理解。进一步解释如下:

1。 max_worker_processes 参数设置数据库允许的最大后台进程数。并行进程是一种后台进程;

2。设置 max_parallel_workers 参数 数据库允许的最大并行进程数。该值小于或等于 max_worker_processes。

3。设置并行进程数分为两类。第一类是并行需求。并行轮询的并行度由 max_parallel_workers_per_gather 参数控制。第二类是维护命令(如CREATE INDEX)。维护命令的并行度由 max_parallel_maintenance_workers 参数控制。

4。 max_parallel_workers_per_gather+max_parallel_maintenance_workers 的值应小于或等于 max_parallel_workers。

按如下方式设置以下并行度参数:

max_worker_processes = 16                     #(更改需要重新启动)
max_parallel_maintenance # 取自 max_parallel_4 _workers max_parallel_workers_ per_gather= 4 # 取自
max_parallel_workers max_parallel_workers = 8

测试环境准备

创建一个大的测试表,插入3000万条数据,如下:

CREATE TABLE big(user_id int4,user_name text,
时区默认时间戳clock_timestamp()) ;INSERT INTO big(user_id ,用户名) 选择 n , n || '_data' FROM create_series(1,30000000) n;;

并行创建索引

在会话级别将 max_parallel_maintenance_workers 设置为 4。

francs=> set max_parallel_maintenance_workers=4;
SET

创建索引如下

francs=> CREATE INDEXcRE ON big); guest上的INDEX

通过top命令可以看到CREATE INDEX命令的进程号为21164,并且有4个并发子进程打开。

PostgreSQL11新特性支持并行创建索引(限B-tree 索引)

创建索引 引入并行度测试

设置不同并行度的 max_parallel_maintenance_workers 来测试并行索引创建时间。

本测试环境为4核8GB内存的虚拟机。测试结果如下:

max_parallel_maintenance_workers索引创建时间(毫秒)
014938.738
210469.283159.283047‸377.147
817020.216

从上面可以看出,当 max_parallel_maintenance_workers 值为 4 时,表示创建索引时存在拐点。

禁用指定表的并行索引创建

通过前面的介绍,可以通过将max_parallel_maintenance_workers参数设置为0来禁用所有表的并行索引创建。那么如何禁用指定表的并行索引创建呢?

您可以使用 ALTER TABLE 方法在表上禁用并行索引创建,如下所示,以禁用大型表上的所有并行索引创建。

francs=> ALTER TABLE large SET (parallel_workers=0);
ALTER TABLE

如果要重置指定表上parallel_workers的参数设置,请使用RESET选项,如下所示:s => ALTER TABLE 大重置(parallel_workers);
ALTER TABLE

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门