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语句的查询不支持并行

3.DECLARE CURSOR 不支持并行

4.包含PARALLEL UNSAFE函数的查询不支持并行

5.事务隔离级别为serializable时不支持并行