francs.tan
2018-11-19
3305浏览量
PostgreSQL 11 版本在并行方面得到增强,例如支持并行创建索引、并行Hash Join、并行 CREATE TABLE .. AS
等,本文先介绍并行创建索引。
PostgreSQL 11 版本并行创建索引仅支持 B-tree 索引,其它类型索引现阶段不支持并行创建。
介绍并行创建索引之前先来看看并行进程的相关 postgresql.conf 参数。
以上参数可能并不容易理解,进一步解释如下:
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 | 索引创建时间(毫秒) |
---|---|
0 | 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
最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!
购买链接:https://item.jd.com/12405774.html
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
分享数据库前沿,解构实战干货,推动数据库技术变革