15.1. Ðак ÑабоÑаÑÑ Ð¿Ð°ÑаллелÑно вÑполнÑемÑе запÑоÑÑ #
Ðогда опÑимизаÑÐ¾Ñ Ð¾Ð¿ÑеделÑеÑ, ÑÑо паÑаллелÑное вÑполнение бÑÐ´ÐµÑ Ð½Ð°Ð¸Ð»ÑÑÑей ÑÑÑаÑегией Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑеÑного запÑоÑа, он ÑоздаÑÑ Ð¿Ð»Ð°Ð½ запÑоÑа, вклÑÑаÑÑий Ñзел Gather (СбоÑ) или Gather Merge (Ð¡Ð±Ð¾Ñ Ñо ÑлиÑнием). ÐзглÑниÑе на пÑоÑÑой пÑимеÑ:
EXPLAIN SELECT * FROM pgbench_accounts WHERE filler LIKE '%x%';
QUERY PLAN
-------------------------------------------------------------------â------------------
Gather (cost=1000.00..217018.43 rows=1 width=97)
Workers Planned: 2
-> Parallel Seq Scan on pgbench_accounts (cost=0.00..216018.33 rows=1 width=97)
Filter: (filler ~~ '%x%'::text)
(4 rows)
Ðо вÑеÑ
ÑлÑÑаÑÑ
Ñзел Gather или Gather Merge бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ñовно один доÑеÑний план, пÑедÑÑавлÑÑÑий ÑаÑÑÑ Ð¾Ð±Ñего плана, вÑполнÑемÑÑ Ð² паÑаллелÑном Ñежиме. ÐÑли Ñзел Gather или Gather Merge ÑаÑполагаеÑÑÑ Ð½Ð° Ñамом веÑÑ
Ñ Ð´ÐµÑева плана, в паÑаллелÑном Ñежиме бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð²ÐµÑÑ Ð·Ð°Ð¿ÑоÑ. ÐÑли он наÑ
одиÑÑÑ Ð³Ð´Ðµ-Ñо в дÑÑгом меÑÑе плана, паÑаллелÑно бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ ÑолÑко ÑаÑÑÑ Ð¿Ð»Ð°Ð½Ð° ниже него. РпÑиведÑнном вÑÑе пÑимеÑе запÑÐ¾Ñ Ð¾Ð±ÑаÑаеÑÑÑ ÑолÑко к одной ÑаблиÑе, Ñак ÑÑо помимо Ñзла Gather еÑÑÑ ÑолÑко еÑÑ Ð¾Ð´Ð¸Ð½ Ñзел плана; и Ñак как ÑÑÐ¾Ñ Ñзел ÑвлÑеÑÑÑ Ð¿Ð¾Ñомком Ñзла Gather, он бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð² паÑаллелÑном Ñежиме.
ÐÑполÑзÑÑ EXPLAIN, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑзнаÑÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво иÑполниÑелей, вÑбÑанное планиÑовÑиком Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ запÑоÑа. Ðогда пÑи вÑполнении запÑоÑа доÑÑигаеÑÑÑ Ñзел Gather, пÑоÑеÑÑ, обÑлÑживаÑÑий ÑÐµÐ°Ð½Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ, запÑаÑÐ¸Ð²Ð°ÐµÑ ÑоновÑе ÑабоÑие пÑоÑеÑÑÑ Ð² ÑÑом колиÑеÑÑве. ÐолиÑеÑÑво иÑполниÑелей, коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¿ÑÑаÑÑÑÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвоваÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑовÑик, огÑаниÑиваеÑÑÑ Ð·Ð½Ð°Ñением max_parallel_workers_per_gather. ÐбÑее ÑиÑло ÑоновÑÑ
ÑабоÑиÑ
пÑоÑеÑÑов, коÑоÑÑе могÑÑ ÑÑÑеÑÑвоваÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñеменно, огÑаниÑиваеÑÑÑ Ð¿Ð°ÑамеÑÑами max_worker_processes и max_parallel_workers. Таким обÑазом, вполне возможно, ÑÑо паÑаллелÑнÑй запÑÐ¾Ñ Ð±ÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð¼ÐµÐ½ÑÑим ÑиÑлом ÑабоÑиÑ
пÑоÑеÑÑов, Ñем планиÑовалоÑÑ, либо вообÑе без дополниÑелÑнÑÑ
ÑабоÑиÑ
пÑоÑеÑÑов. ÐпÑималÑноÑÑÑ Ð¿Ð»Ð°Ð½Ð° Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð²Ð¸ÑеÑÑ Ð¾Ñ ÑиÑла доÑÑÑпнÑÑ
ÑабоÑиÑ
пÑоÑеÑÑов, Ñак ÑÑо иÑ
неÑ
ваÑка Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð²Ð»ÐµÑÑ Ð·Ð½Ð°ÑиÑелÑное Ñнижение пÑоизводиÑелÑноÑÑи. ÐÑли ÑÑо наблÑдаеÑÑÑ ÑаÑÑо, Ð¸Ð¼ÐµÐµÑ ÑмÑÑл ÑвелиÑиÑÑ max_worker_processes и max_parallel_workers, ÑÑÐ¾Ð±Ñ Ð¾Ð´Ð½Ð¾Ð²Ñеменно могло ÑабоÑаÑÑ Ð±Ð¾Ð»ÑÑе пÑоÑеÑÑов, либо наобоÑÐ¾Ñ ÑменÑÑиÑÑ max_parallel_workers_per_gather, ÑÑÐ¾Ð±Ñ Ð¿Ð»Ð°Ð½Ð¸ÑовÑик запÑаÑивал иÑ
в менÑÑем колиÑеÑÑве.
ÐаждÑй ÑоновÑй ÑабоÑий пÑоÑеÑÑ, ÑÑпеÑно запÑÑеннÑй Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ паÑаллелÑного запÑоÑа, бÑÐ´ÐµÑ Ð²ÑполнÑÑÑ Ð¿Ð°ÑаллелÑнÑÑ ÑаÑÑÑ Ð¿Ð»Ð°Ð½Ð°. ÐедÑÑий пÑоÑеÑÑ Ñакже бÑÐ´ÐµÑ Ð²ÑполнÑÑÑ ÑÑÑ ÑаÑÑÑ Ð¿Ð»Ð°Ð½Ð°, но он неÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¾ÑвеÑÑÑвенноÑÑÑ: он должен Ñакже пÑоÑиÑаÑÑ Ð²Ñе коÑÑежи, вÑданнÑе ÑабоÑими пÑоÑеÑÑами. Ðогда паÑаллелÑÐ½Ð°Ñ ÑаÑÑÑ Ð¿Ð»Ð°Ð½Ð° вÑдаÑÑ Ð»Ð¸ÑÑ Ð½ÐµÐ±Ð¾Ð»ÑÑое колиÑеÑÑво коÑÑежей, ведÑÑий ÑаÑÑо ведÑÑ ÑÐµÐ±Ñ Ð¿ÑоÑÑо как один из ÑабоÑиÑ
пÑоÑеÑÑов, ÑÑкоÑÑÑ Ð²Ñполнение запÑоÑа. РнапÑоÑив, когда паÑаллелÑÐ½Ð°Ñ ÑаÑÑÑ Ð¿Ð»Ð°Ð½Ð° вÑдаÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво коÑÑежей, ведÑÑий Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾ÑÑи вÑÑ Ð²ÑÐµÐ¼Ñ Ð·Ð°Ð½ÑÑ ÑÑением коÑÑежей, вÑдаваемÑÑ
дÑÑгими ÑабоÑими пÑоÑеÑÑами, и вÑполнÑÑÑ Ð´ÑÑгие Ñаги обÑабоÑки, ÑвÑзаннÑе Ñ Ñзлами плана вÑÑе Ñзла Gather или Gather Merge. Ð ÑакиÑ
ÑлÑÑаÑÑ
ведÑÑий пÑоÑеÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð½Ð¾ÑиÑÑ Ð»Ð¸ÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑнÑй вклад в вÑполнение паÑаллелÑной ÑаÑÑи плана.
Ðогда над паÑаллелÑной ÑаÑÑÑÑ Ð¿Ð»Ð°Ð½Ð° оказÑваеÑÑÑ Ñзел Gather Merge, а не Gather, ÑÑо ознаÑаеÑ, ÑÑо вÑе пÑоÑеÑÑÑ, вÑполнÑÑÑие ÑаÑÑи паÑаллелÑного плана, вÑдаÑÑ ÐºÐ¾ÑÑежи в оÑÑоÑÑиÑованном поÑÑдке, и ÑÑо ведÑÑий пÑоÑеÑÑ Ð²ÑполнÑÐµÑ ÑлиÑние Ñ ÑоÑ
Ñанением поÑÑдка. Узел же Gather, напÑоÑив, полÑÑÐ°ÐµÑ ÐºÐ¾ÑÑежи Ð¾Ñ Ð¿Ð¾Ð´ÑинÑннÑÑ
пÑоÑеÑÑов в пÑоизволÑном Ñдобном ÐµÐ¼Ñ Ð¿Ð¾ÑÑдке, наÑÑÑÐ°Ñ Ð¿Ð¾ÑÑдок ÑоÑÑиÑовки, коÑоÑÑй мог ÑÑÑеÑÑвоваÑÑ.