max_parallel_workers 与 max_parallel_workers_per_gather

Boo*_*oom 4 postgresql parallel-processing

我已经用简单的查询测试了并行性,但我不明白结果。

我检查了以下参数pg_settings

max_parallel_workers = 8
max_parallel_workers_per_gather = 2
Run Code Online (Sandbox Code Playgroud)

我运行以下查询(该表包含约 16M 行):

explain analyze
select *
from tbl
where value<>-1
Run Code Online (Sandbox Code Playgroud)

结果:

Gather (cost=1000.00 .. 1136714.86 rows=580941 width=78 actual time=0.495..3057.813 rows = 587886 loops=1)
workers planned: 2
workers launched: 2
 -> parallel seq scan on tbl (cost=0.00..10776.76 rows=242059 width=718) (actual time=0.095..2968.77 rows=195962 loops=3)  
    filter: (value<>-1::integer)
    rows removed by filter: 5389091
plain time: 0.175ms
exection time: 3086.243ms
Run Code Online (Sandbox Code Playgroud)
  1. 为什么查询只用 2 个工作线程而不是 8 个工作线程运行?
  2. max_parallel_workers和 和有什么不一样max_parallel_workers_per_gather?何时使用每个值?

Lau*_*lbe 7

max_parallel_workers限制整个数据库集群中可以同时活动的并行工作进程的数量。它必须小于或等于max_worker_processes

max_parallel_workers_per_gather限制可用于单个查询的并行工作进程的数量。

这个想法是限制并行查询的资源,同时确保没有一个查询可以占用所有资源。