ITPub博客

首页 > > > PostgreSQL 11 新特性解读|支持并行创建索引(Parallel Index Builds)

PostgreSQL 11 新特性解读|支持并行创建索引(Parallel Index Builds)

作者:wangliyun 时间:2020-03-12 15:00:27 0 删除 编辑

作者介绍

谭峰 网名francs,中国开源软件推进联盟PostgreSQL分会特聘专家,《PostgreSQL实战》作者之一,《PostgreSQL 9 Administration Cookbook》译者之一,致力于PostgreSQL技术分享,博客 https://postgres.fun

 

PostgreSQL 11 版本在并行方面得到增强,例如支持并行创建索引、并行Hash Join、并行 CREATE TABLE .. AS等,本文先介绍并行创建索引。

PostgreSQL 11 版本并行创建索引仅支持 B-tree 索引,其它类型索引现阶段不支持并行创建。

并行进程相关参数

介绍并行创建索引之前先来看看并行进程的相关 postgresql.conf 参数。

  • 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。

postgresql.conf 设置以下并行度参数如下:


max_worker_processes = 16               # (change requires restart)
max_parallel_maintenance_workers = 4    # taken from max_parallel_workers
max_parallel_workers_per_gather = 4     # taken from 

max_parallel_workers

max_parallel_workers = 8

测试环境准备

创建测试表big并插入3000万条数据,如下:


CREATE TABLE big(user_id int4,user_name text,
ctime 
timestamp(6) without time zone default clock_timestamp());

INSERT INTO big(user_id,user_name) SELECT  n ,n || '_data' FROM generate_series(1,30000000) n;;

并行创建索引

在会话级设置max_parallel_maintenance_workers值为4。


francs=> set max_parallel_maintenance_workers=4;
SET

创建索引,如下


francs=> CREATE INDEX idx_big_ctime ON big USING BTREE(ctime);
CREATE INDEX

在主机上通过 top 命令可以看到 CREATE INDEX 命令的进程号为 21164,并且开启了4个并发子进程。


创建索引引并行度测试

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

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

max_parallel_maintenance_workers

索引创建时间(毫秒)

14938.738

2

10469.283

4

10439.237

6

11577.147

8

17020.216

从以上看出,当 max_parallel_maintenance_workers 值为4时索引创建时间出现拐点。

关闭指定表并行创建索引

通过前面介绍大家知道可通过设置max_parallel_maintenance_workers参数为0关闭所有表的并行创建索引,那么如何关闭指定表的并行索引创建呢?

可通过 ALTER TABLE 方式禁止表上的并行创建索引,如下禁止表big上的所有并行创建索引。


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

如果想恢复指定表上的parallel_workers参数设置,使用 RESET 选项即可,如下:


francs=> ALTER TABLE big RESET(parallel_workers);
ALTER
TABLE

 



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69917105/viewspace-3161881/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-19

  • 博文量
    213
  • 访问量
    317