天天看點

PG--并行

postgres=# select name ,setting from pg_settings where name like '%parallel%';
               name               | setting 
----------------------------------+---------
 enable_parallel_append           | on
 enable_parallel_hash             | on
 force_parallel_mode              | off
 max_parallel_maintenance_workers | 2
 max_parallel_workers             | 8
 max_parallel_workers_per_gather  | 2
 min_parallel_index_scan_size     | 64    并行掃描的最小索引大小
 min_parallel_table_scan_size     | 1024  并行掃描的最小表大小
 parallel_leader_participation    | on
 parallel_setup_cost              | 1000  并行啟動的代價
 parallel_tuple_cost              | 0.1   表示每個tuple從worker傳遞給leader的代價,worker
 将一個tuple放入共享記憶體隊列DSM,然後leader從中讀取的代價。      

max_parallel_workers

設定系統支援的并行查詢程序數。不過得小于max_worker_processes的值,因為并行worker是從該max_worker_processes建立的worker程序池中擷取的。

max_parallel_workers_per_gather

控制一個并行的EXEC NODE最多能開啟多少個并行worker,也就是單個Gather節點的并行度。受到max_worker_processes和max_parallel_workers的限制,同時需要注意,在OLTP業務系統中,不要設定太大,因為每個worker都會消耗同等的work_mem等資源,因為每個散列連接配接或排序操作都需要一個work_mem記憶體量,可能不僅僅是查詢:work_mem * processes * joins。建議在OLAP中使用并行,并且做好任務排程,減輕沖突。

max_parallel_maintenance_workers

指定在CREATE INDEX(目前隻支援BTREE),CREATE TABLE AS,SELECT INTO 的并行數量,我們可以在create index的時候指定該參數的數量,預設是2,在合适的時候(比如表足夠大)就會使用兩個工作程序來建立索引,但需要配合maintenance_work_mem參數,可以有效提升建立索引的速度。

parallel_leader_participation

是一個 GUC 參數,使用者可以顯式控制是否需要 leader 參與子計劃的執行,預設為on。

min_parallel_index_scan_size

是使用并行掃描的最小  表大小

min_parallel_table_scan_size

是使用并行掃描的最小  索引大小

parallel_workers

是一個表級的參數,和fillfactor等類似,很容易被忽略,該參數表示表級并行度,指定對表掃描可以啟用的工作程序數,預設不設定,依據表的大小計算出一個值,

alter table test set (parallel_workers =32);

force_parallel_mode

表示強制開啟并行,可以用來模仿Oracle的Hint。

set force_parallel_mode to on;

不支援并行查詢場景

1.任何寫資料或者鎖行的查詢均不支援并行,CREATE TABLE ... AS,SELECT INTO,和CREATE MATERIALIZED VIEW等建立新表的指令可以并行

2.包含 CTE語句的查詢不支援并行

繼續閱讀