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