max_parallel_workers против max_parallel_workers_per_gather

#postgresql #parallel-processing

#postgresql #параллельная обработка

Вопрос:

Я протестировал параллелизм с помощью простого запроса, и я не понимаю результатов.

Я проверил следующие параметры из pg_settings :

 max_parallel_workers = 8
max_parallel_workers_per_gather = 2
  

Я запускаю следующий запрос (таблица содержит ~ 16 миллионов строк):

 explain analyze
select *
from tbl
where value<>-1
  

Результаты:

 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
  
  1. почему запрос выполняется только с 2 рабочими, а не с 8?
  2. в чем разница между max_parallel_workers и max_parallel_workers_per_gather ? когда будет использоваться каждое из значений?

Комментарии:

1. В нем использовалось 2 рабочих, потому что операция gather ограничена max_parallel_workers_per_gather

Ответ №1:

max_parallel_workers ограничивает количество параллельных рабочих процессов, которые могут быть активны одновременно во всем кластере базы данных. Оно должно быть меньше или равно max_worker_processes .

max_parallel_workers_per_gather ограничивает количество параллельных рабочих процессов, которые могут быть использованы для одного запроса.

Идея состоит в том, чтобы ограничить ресурсы для параллельного запроса, убедившись при этом, что ни один запрос не сможет использовать все ресурсы.