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

2019-03-3117:52:37数据库教程Comments3,786 views字数 2083阅读模式

PostgreSQL 11 版本在并行方面得到增强,例如支持并行创建索引、并行Hash Join、并行 CREATE TABLE .. AS等,本文先介绍并行创建索引。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

PostgreSQL 11 版本并行创建索引仅支持 B-tree 索引,其它类型索引现阶段不支持并行创建。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

并行进程相关参数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

介绍并行创建索引之前先来看看并行进程的相关 参数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

  • max_parallel_maintenance_workers

max_parallel_maintenance_workers 参数设置维护命令(例如 CREATE INDEX)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

命令允许的最大并行进程数,默认值为2。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

  • max_parallel_workers

设置系统支持的最大并行进程数,默认值为8。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

  • max_worker_processes

设置数据库的最大后台进程数,默认值为8。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

  • max_parallel_workers_per_gather

设置单个Gather或Gather Merge节点能够启用的最大并行进程数,默认值为2,文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

并行查询(Parallel Query)的并行度受此参数的影响,CREATE INDEX 命令的并行度不受此参数影响。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

以上参数可能并不容易理解,进一步解释如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

1. max_worker_processes 参数设置的是数据库允许的最大后台进程数,并行进程属于后台进程的一种;文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

2. max_parallel_workers 参数设置数据库允许的最大并行进程数,这个值小于或等于 max_worker_processes。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

3. 并行进程数设置分为两类,第一类是并行查询,并行查询的并行度由 max_parallel_workers_per_gather 参数控制,第二类是维护命令(例如 CREATE INDEX),维护命令的并行度由 max_parallel_maintenance_workers 参数控制。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

4. max_parallel_workers_per_gather+max_parallel_maintenance_workers值应小于或等于 max_parallel_workers。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

设置以下并行度参数如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

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_workersmax_parallel_workers = 8

测试环境准备文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

创建测试表big并插入3000万条数据,如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

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;;

并行创建索引文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

在会话级设置max_parallel_maintenance_workers值为4。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

francs=> set max_parallel_maintenance_workers=4;
SET

创建索引,如下文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

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

在主机上通过 top 命令可以看到 CREATE INDEX 命令的进程号为 21164,并且开启了4个并发子进程。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

PostgreSQL11新特性支持并行创建索引(限B-tree 索引)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

创建索引引并行度测试文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

设置 max_parallel_maintenance_workers 值不同并行度,测试并行索引创建的时间。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

本测试环境为一台4核8GB内存的虚机,测试结果如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

max_parallel_maintenance_workers索引创建时间(毫秒)
014938.738
210469.283
410439.237
611577.147
817020.216

从以上看出,当 max_parallel_maintenance_workers 值为4时索引创建时间出现拐点。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

关闭指定表并行创建索引文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

通过前面介绍大家知道可通过设置max_parallel_maintenance_workers参数为0关闭所有表的并行创建索引,那么如何关闭指定表的并行索引创建呢?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

可通过 ALTER TABLE 方式禁止表上的并行创建索引,如下禁止表big上的所有并行创建索引。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

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

如果想恢复指定表上的parallel_workers参数设置,使用 RESET 选项即可,如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html

francs=> ALTER TABLE big RESET(parallel_workers);
ALTER TABLE
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/11076.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/sjk/11076.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定