За замовчуванням один запит виконується одним процесом на одному ядрі. Паралельний запит ділить роботу між кількома процесами-воркерами: кожен обробляє частину таблиці, а головний процес збирає результати.
Finalize Aggregate
-> Gather (Workers Planned: 2, Workers Launched: 2)
-> Partial Aggregate
-> Parallel Seq Scan on orders
Що вміє працювати паралельно: послідовне й індексне сканування, Hash Join і Nested Loop, агрегати, сортування з об'єднанням (Gather Merge), створення B-tree індексів.
Ключові налаштування:
max_parallel_workers_per_gather(за замовчуванням 2) - воркерів на один вузол запиту;max_parallel_workersіmax_worker_processes- загальні ліміти на сервер;min_parallel_table_scan_size- менші таблиці не розпаралелюються;parallel_setup_cost,parallel_tuple_cost- вартість запуску й передачі рядків, з якою планувальник порівнює виграш.
Коли паралельність допомагає: аналітичні запити, що читають і агрегують мільйони рядків, - звіти, дашборди, пакетні обчислення.
Коли не допомагає чи шкодить:
- OLTP-запити (знайти користувача за ID) - запуск воркерів коштує більше, ніж сам запит; планувальник їх і не розпаралелить.
- Високе паралельне навантаження: якщо сервер і так зайнятий сотнями запитів, воркери конкурують з ними за ядра. Сумарна пропускна здатність може впасти.
- Запити, що змінюють дані (
UPDATE,DELETE), майже не розпаралелюються, аINSERT ... SELECT- лише частково. - Функції, позначені
PARALLEL UNSAFE(за замовчуванням для власних функцій), забороняють паралельний план.
Як діагностувати: Workers Planned проти Workers Launched у EXPLAIN ANALYZE - якщо запущено менше запланованого, на сервері забракло вільних воркерів.