天天看點

PostgreSQL 9.6 引領開源資料庫攻克多核并行計算難題

digoal

2016-10-01

postgresql , 9.6 , 并行計算 , 多核計算

經過多年的醞釀(從支援work process到支援動态fork共享記憶體,再到核心層面支援并行計算),postgresql 的多核并行計算功能終于在2016年釋出的9.6版本中正式上線,為pg的scale up能力再次拔高一個台階,标志着開源資料庫已經攻克了并行計算的難題。

相信有很多小夥伴已經開始測試了。

在32實體核的機器上進行了測試,重計算的場景,性能程線性提升。

目前并行計算支援全表掃描,join,聚合。

為了讓大夥能夠快速用上9.6,以下是一個簡單的安裝說明。

os 準備

安裝

初始化叢集

配置資料庫參數

啟動資料庫

1. 控制整個資料庫叢集同時能開啟多少個work process,必須設定。

2. 控制一個并行的exec node最多能開啟多少個并行處理單元,同時還需要參考表級參數parallel_workers,或者pg核心内置的算法,根據表的大小計算需要開啟多少和并行處理單元。

實際取小的。

3. 計算并行處理的成本,如果成本高于非并行,則不會開啟并行處理。

4. 小于這個值的表,不會開啟并行。

5. 告訴優化器,強制開啟并行。

6. 表級參數,不通過表的大小計算并行度,而是直接告訴優化器這個表需要開啟多少個并行計算單元。

在标簽系統中,通常會有多個屬性,每個屬性使用一個标簽标示,最簡單的标簽是用0和1來表示,代表true和false。

我們可以把所有的标簽轉換成比特位,例如系統中一共有200個标簽,5000萬使用者。

那麼我們可以通過标簽的位運算來圈定特定的人群。

這樣就會涉及bit位的運算。

那麼我們來看看postgresql位運算的性能如何?

建立一張測試表,包含一個比特位字段,後面用于測試。

并行插入32億記錄

單表32億,180gb

非并行模式

取測試三輪後的結果,排除cache影響。

并行模式

PostgreSQL 9.6 引領開源資料庫攻克多核并行計算難題
PostgreSQL 9.6 引領開源資料庫攻克多核并行計算難題

并行插入10億記錄

單表10億,56gb

PostgreSQL 9.6 引領開源資料庫攻克多核并行計算難題

1億 join 5000萬

PostgreSQL 9.6 引領開源資料庫攻克多核并行計算難題

建議join不要設定太大的并行度。

guc變量

如果同時還設定了表的并行度parallel_workers,則最終并行度取min(max_parallel_degree , parallel_degree )

如果表沒有設定并行度parallel_workers ,則根據表的大小 和 parallel_threshold 這個寫死值決定,計算得出(見函數create_plain_partial_paths)

依舊受到max_parallel_workers_per_gather 參數的限制,不能大于它,取小的,前面已經交代了。

代碼如下(release後可能有些許修改)

src/backend/optimizer/util/plancat.c

src/include/utils/rel.h

src/backend/optimizer/path/allpaths.c

表級參數

6. 不通過表的大小計算并行度,而是直接告訴優化器這個表需要開啟多少個并行計算單元。

<a href="http://info.flagcounter.com/h9v1">count</a>