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語句的查詢不支援并行