PostgreSQL 并行查询

1 背景知识

2 并行主要参数

2.1 max_worker_processes

(1)设置系统能够支持的后台进程的最大数量,默认为8。
(2)备库上的该参数值应大于等于主库上的值,否则可能导致不允许从库执行查询。
(3)该参数值影响并限制max_parallel_workers_per_gather参数的实际取值。
(4)该参数只能在服务启动前设置。
(5)生产环境可以与CPU核数相等。

2.2 max_parallel_workers

(1)设置所有会话在同一时刻执行查询时,允许开启的总的worker进程数,默认为8。
(2)该参数取值不建议超过max_worker_processes参数的值。
(3)该参数值影响并限制max_parallel_workers_per_gather参数的实际取值。

2.3 max_parallel_workers_per_gather

(1)设置会话中并行查询的最大并行进程数,默认为0,表示禁用并行查询。
(2)它同时受参数max_worker_processes和max_parallel_workers限制。
(3)生产环境建议设置为CPU核数的一半,向上取整。

2.4 parallel_workers

(1)在表级设置并行度的参数。例:ALTER TABLE t01 SET (parallel_workers =32);
(2)表级并行度优先,未设置表级并行度时会根据表的存储空间大小计算并行度。

3 分区并行参数

3.1 enable_partitionwise_join

分区表JOIN时是否允许并行操作,默认为off。

3.2 enable_partitionwise_aggregate

分区表分区聚合时是否允许并行操作,默认为off。

3.3 enable_parallel_hash

执行HASH计算时是否允许并行操作,默认为on。

3.4 enable_parallel_append

执行分区表APPEND和UNION ALL查询时是否允许并行操作,默认为on。

4 其他参数

4.1 min_parallel_table_scan_size

4.2 min_parallel_index_scan_size

Note

(1)这2个参数用于判断在扫描指定的表(或条引)时,是否启用并行,当表(或索引)的存储空间占用大小大于等于该参数值时,才会使用并行扫描。
(2)这2个参数还参与决定到底分配多少个Worker。当表(或索引)大小为x时,计算公式为:Workers= log(x /min_parallel_table(或index)scan_size)/log(3) + 1。
例:SET min_parallel_table_scan_size='8MB'
table为8MB时 => 1 worker
table为24MB时 => 2 workers
table为72MB时 => 3 workers
编者注:表(或索引)的大小每比min_parallel
(table|index)_scan_size大3倍,KES就增加一个worker。

4.3 parallel_tuple_cost

(1)Leader和Worker之间的通信需要时间,时间与Worker发送的元组数成正比。
(2)该参数指定并行执行时处理每行的通信成本,用于评估并行执行代价。

4.4 parallel_setup_cost

(1)并行计算的启动成本,它模拟了内存设置、进程启动和初始通信所花费的时间。
(2)如果估算出的非并行计算的成本低于并行计算的成本,则不会选择使用并行计算。(3)此参数可以避免短查询使用并行。

4.5 force_parallel_mode

(1)设置为on时表示优化器强制选择并行计算.
(2)参数默认值为off。

4.6 parallel_leader_participation

Leader
主动获取并行Worker的返回结果,默认为on。

4.7 PG 是否使用到并行查询

  1. 如果 并行查询有聚组函数时,才会进行并行查询。

4.8 Hash join

  1. 在postgresql 11 之前,每个work 都会使用自己的hash 表,会话之间无法共享。
  2. 在postgresql 11 之后,会建立共享的hash 表,会话之间可以共享。