并行方式全表扫描功能已提交9.6版本主干代码中 |
doudou586 发布于2015-12-07 15:44:21 评论: 1 浏览: 35146 顶: 3217 踩: 3535 |
以下博文翻译自PostgreSQL主要代码贡献人员之一Robert Haas的博客(详情可浏览:http://www.postgresql.org/community/contributors/),同时他也是并行方式全表扫描功能的主要开发人员, 原文地址: http://rhaas.blogspot.com/2015/11/parallel-sequential-scan-is-committed.html (Blogspot现为Google旗下网站,得翻墙)
我以前建议过将并行全表扫描功能加入至PostgreSQL 9.5中,但未实现。然而,今天我很高兴地向各位通报 我已经将第一版本的并行扫描功能提交至PostgreSQL的开发主分支中,我们确认它将会包含在将要发布的9.6版本中。
为PostgreSQL增加并行查询功能,目前这只是第一步,它也是我长久以来的一个梦想,我已为此工作了好几年了, 最早真正开发时是在9.4版本的开发期间,那时我主要是开发了一些后台动态进程和动态共享内存;接着在9.5版本 期间,我又增加了很多有关并行机制的底层基本加松的开发,以及其他包含在提交的补丁的内容。下面我想说提交的 主要内容明细和下一步还准备要开发的工作和大家沟通一下。
在开始之前,我想首先将这些荣誉给一些应该得的人。首先,Amit Kapila为这个项目中贡献了巨大的帮助。主要是由 Amit和我写了这个功能的大部分代码,这些代码经过涵盖在最近几年多次提交的补丁中。我们俩也写了大量的没有包含在补丁 中的代码。第二,我想感谢Noah Misch,在项目早期阶段,在我被一些问题给绕得晕头转向时,他给了我很大的帮助;第三,我想向整 向PostgreSQL社区的成员,尤其是所有帮助我进行代码审核、功能测试、提出改进意见以及在很多其他方面提供帮助而最终 使用这个功能得以实现的人们。
最为重要的是,我要感谢EnterpriseDB公司,没有EnterpriseDB公司管理上的支持,尤其是来自Tom Kincaid和Marc Linster的支持, 也就不可能让我和Amit有大量的时间开发并最终完成这个项目。同样地,没有我在EnterpriseDB公司的团队的支持,我们的项目也 不可能现在完成,当我忙于项目开发时,我的同事们耐心地帮助我处理了其他的问题。谢谢所有的人。好了,现在我们来看一下测试效果:
rhaas=# \timing Timing is on. rhaas=# select * from pgbench_accounts where filler like '%a%'; aid | bid | abalance | filler -----+-----+----------+-------- (0 rows) Time: 743.061 ms rhaas=# set max_parallel_degree = 4; SET Time: 0.270 ms rhaas=# select * from pgbench_accounts where filler like '%a%'; aid | bid | abalance | filler -----+-----+----------+-------- (0 rows) Time: 213.412 ms
这里是查询计划的内容:
rhaas=# explain (costs off) select * from pgbench_accounts where filler like '%a%'; QUERY PLAN --------------------------------------------- Gather Number of Workers: 4 -> Parallel Seq Scan on pgbench_accounts Filter: (filler ~~ '%a%'::text) (4 rows)
目前因该功能还在进一步的开发中,还有一些未处理的问题和使用限制,如现在该功能暂不能在分区表上使用; 仅可对表的全表扫描类查询较有效,有索引的列就用不上了,当然对数据的过滤的操作,多进程并行处理总是要快一些; 还有就是并行处理的进程数如何根据系统配置进行最有效设置,以及其他一些小问题还未完全完成。
最后,也是请大家多多进行测试,并给我们反馈Bug,谢谢!