并行方式全表掃描功能已提交 PG 9.6 版主干代碼
以下博文翻譯自PostgreSQL主要代碼貢獻人員之一Robert Haas的博客(詳情可瀏覽:http://www.postgresql.org/community/contributors/),同時他也是并行方式全表掃描功能的主要開發人員, 原文地址:http://rhaas.blogspot.com/2015/11/parallel-sequential-scan-is-committed.html (Blogspot現為Google旗下網站,得KX上網)
我以前建議過將并行全表掃描功能加入至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,謝謝!