15.2. Ðогда Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ ÑаÑпаÑаллеливание запÑоÑов?
ÐланиÑовÑик запÑоÑов Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑказаÑÑÑÑ Ð¾Ñ Ð¿Ð¾ÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¿Ð°ÑаллелÑнÑÑ Ð¿Ð»Ð°Ð½Ð¾Ð² запÑоÑов в лÑбом ÑлÑÑае под влиÑнием неÑколÑÐºÐ¸Ñ Ð¿Ð°ÑамеÑÑов. ЧÑÐ¾Ð±Ñ Ð¾Ð½ ÑÑÑоил паÑаллелÑнÑе Ð¿Ð»Ð°Ð½Ñ Ð·Ð°Ð¿ÑоÑов пÑи ÐºÐ°ÐºÐ¸Ñ -Ð±Ñ Ñо ни бÑло ÑÑловиÑÑ , опиÑаннÑе далее паÑамеÑÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ наÑÑÑоиÑÑ ÑказаннÑм обÑазом.
max_parallel_workers_per_gather должен имеÑÑ Ð·Ð½Ð°Ñение, болÑÑее нÑлÑ. ÐÑо оÑобÑй ваÑÐ¸Ð°Ð½Ñ Ð±Ð¾Ð»ÐµÐµ обÑего огÑаниÑÐµÐ½Ð¸Ñ Ð½Ð° ÑÑммаÑное ÑиÑло иÑполÑзÑемÑÑ ÑабоÑÐ¸Ñ Ð¿ÑоÑеÑÑов, задаваемого паÑамеÑÑом
max_parallel_workers_per_gather.dynamic_shared_memory_type должен имеÑÑ Ð·Ð½Ð°Ñение, оÑлиÑное оÑ
none. ÐÐ»Ñ Ð¿Ð°ÑаллелÑного вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов нÑжна динамиÑеÑÐºÐ°Ñ Ð¾Ð±ÑÐ°Ñ Ð¿Ð°Ð¼ÑÑÑ, ÑеÑез коÑоÑÑÑ Ð±ÑдÑÑ Ð¿ÐµÑедаваÑÑÑÑ Ð´Ð°Ð½Ð½Ñе Ð¼ÐµÐ¶Ð´Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑвÑÑÑими пÑоÑеÑÑами.
Рдополнение к ÑÑомÑ, ÑиÑÑема должна ÑабоÑаÑÑ Ð½Ðµ в однополÑзоваÑелÑÑком Ñежиме. Так как в ÑÑом Ñежиме вÑÑ Ð¡Ð£ÐÐ ÑабоÑÐ°ÐµÑ Ð² одном пÑоÑеÑÑе, ÑоновÑе ÑабоÑие пÑоÑеÑÑÑ Ð² нÑм недоÑÑÑпнÑ.
Ðаже еÑли пÑинÑипиалÑно возможно поÑÑÑоиÑÑ Ð¿Ð°ÑаллелÑнÑе Ð¿Ð»Ð°Ð½Ñ Ð²ÑполнениÑ, планиÑовÑик не бÑÐ´ÐµÑ ÑÑÑоиÑÑ Ñакой план Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного запÑоÑа, еÑли Ð¸Ð¼ÐµÐµÑ Ð¼ÐµÑÑо одно из ÑледÑÑÑÐ¸Ñ Ð¾Ð±ÑÑоÑÑелÑÑÑв:
ÐапÑÐ¾Ñ Ð²ÑполнÑÐµÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð¸Ð»Ð¸ блокиÑÑÐµÑ ÑÑÑоки в базе даннÑÑ . ÐÑли запÑÐ¾Ñ ÑодеÑÐ¶Ð¸Ñ Ð¾Ð¿ÐµÑаÑиÑ, изменÑÑÑÑÑ Ð´Ð°Ð½Ð½Ñе либо на веÑÑ Ð½ÐµÐ¼ ÑÑовне, либо внÑÑÑи CTE, Ð´Ð»Ñ Ñакого запÑоÑа не бÑдÑÑ ÑÑÑоиÑÑÑÑ Ð¿Ð°ÑаллелÑнÑе планÑ. ÐÑо огÑаниÑение ÑекÑÑей ÑеализаÑии, коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑмÑгÑено в бÑдÑÑÐ¸Ñ Ð²ÐµÑÑиÑÑ .
ÐапÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑиоÑÑановлен в пÑоÑеÑÑе вÑполнениÑ. Ð ÑиÑÑаÑиÑÑ , когда ÑиÑÑема ÑеÑаеÑ, ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð¼ÐµÑÑо ÑаÑÑиÑное или дополниÑелÑное вÑполнение, план паÑаллелÑного вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ ÑÑÑоиÑÑÑ. ÐапÑимеÑ, кÑÑÑоÑ, ÑозданнÑй пÑедложением DECLARE CURSOR, никогда не бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ð¿Ð°ÑаллелÑнÑй план. ÐодобнÑм обÑазом, Ñикл PL/pgSQL вида
FOR x IN query LOOP .. END LOOPникогда не бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ð¿Ð°ÑаллелÑнÑй план, Ñак как ÑиÑÑема паÑаллелÑнÑÑ Ð·Ð°Ð¿ÑоÑов не ÑÐ¼Ð¾Ð¶ÐµÑ Ð¾Ð¿ÑеделиÑÑ, Ð¼Ð¾Ð¶ÐµÑ Ð»Ð¸ безопаÑно вÑполнÑÑÑÑÑ ÐºÐ¾Ð´ внÑÑÑи Ñикла во вÑÐµÐ¼Ñ Ð¿Ð°ÑаллелÑного вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа.РзапÑоÑе иÑполÑзÑÑÑÑÑ ÑÑнкÑии, помеÑеннÑе как
PARALLEL UNSAFE. ÐолÑÑинÑÑво ÑиÑÑемнÑÑ ÑÑнкÑий безопаÑÐ½Ñ Ð´Ð»Ñ Ð¿Ð°ÑаллелÑного вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ (PARALLEL SAFE), но полÑзоваÑелÑÑкие ÑÑнкÑии по ÑмолÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð¼ÐµÑаÑÑÑÑ ÐºÐ°Ðº небезопаÑнÑе (PARALLEL UNSAFE). ÐÑа Ñ Ð°ÑакÑеÑиÑÑика ÑÑнкÑии ÑаÑÑмаÑÑиваеÑÑÑ Ð² Разделе 15.4.ÐапÑÐ¾Ñ ÑабоÑÐ°ÐµÑ Ð²Ð½ÑÑÑи дÑÑгого запÑоÑа, Ñже паÑаллелÑного. ÐапÑимеÑ, еÑли ÑÑнкÑиÑ, вÑзÑÐ²Ð°ÐµÐ¼Ð°Ñ Ð² паÑаллелÑном запÑоÑе, Ñама вÑполнÑÐµÑ SQL-запÑоÑ, поÑледний запÑÐ¾Ñ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° не бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð¿Ð°ÑаллелÑно. ÐÑо огÑаниÑение ÑекÑÑей ÑеализаÑии, но ÑбиÑаÑÑ ÐµÐ³Ð¾ вÑÑд ли ÑледÑеÑ, Ñак как ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð´Ð½Ð¸Ð¼ запÑоÑом ÑÑезмеÑного колиÑеÑÑва пÑоÑеÑÑов.
ÐÐ»Ñ ÑÑанзакÑии ÑÑÑановлен ÑеÑиализÑемÑй ÑÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð·Ð¾Ð»ÑÑии. ÐÑо огÑаниÑение ÑекÑÑей ÑеализаÑии.
Ðаже когда Ð´Ð»Ñ Ð¾Ð¿ÑеделÑнного запÑоÑа поÑÑÑоен паÑаллелÑнÑй план, Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ ÑазлиÑнÑе обÑÑоÑÑелÑÑÑва, пÑи коÑоÑÑÑ
ÑÑÐ¾Ñ Ð¿Ð»Ð°Ð½ нелÑÐ·Ñ Ð±ÑÐ´ÐµÑ Ð²ÑполниÑÑ Ð² паÑаллелÑном Ñежиме. Ð ÑÑиÑ
ÑлÑÑаÑÑ
ведÑÑий пÑоÑеÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½Ð¸Ñ ÑаÑÑÑ Ð¿Ð»Ð°Ð½Ð° ниже Ñзла Gather полноÑÑÑÑ ÑамоÑÑоÑÑелÑно, как еÑли Ð±Ñ Ñзла Gather вовÑе не бÑло. ÐÑо пÑоизойдÑÑ ÑолÑко пÑи вÑполнении одного из ÑледÑÑÑиÑ
ÑÑловий:
Ðевозможно полÑÑиÑÑ Ð½Ð¸ одного Ñонового ÑабоÑего пÑоÑеÑÑа из-за огÑаниÑÐµÐ½Ð¸Ñ Ð¾Ð±Ñего ÑиÑла ÑÑÐ¸Ñ Ð¿ÑоÑеÑÑов знаÑением max_worker_processes.
Ðевозможно полÑÑиÑÑ Ð½Ð¸ одного Ñонового ÑабоÑего пÑоÑеÑÑа из-за огÑаниÑÐµÐ½Ð¸Ñ Ð¾Ð±Ñего ÑиÑла ÑÐ°ÐºÐ¸Ñ Ð¿ÑоÑеÑÑов Ð´Ð»Ñ Ð¿Ð°ÑаллелÑного вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñением max_parallel_workers.
ÐÐ»Ð¸ÐµÐ½Ñ Ð¿ÐµÑедаÑÑ ÑообÑение Execute Ñ Ð½ÐµÐ½ÑлевÑм колиÑеÑÑвом вÑбиÑаемÑÑ ÐºÐ¾ÑÑежей. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº опиÑÐ°Ð½Ð¸Ñ Ð¿ÑоÑокола ÑаÑÑиÑеннÑÑ Ð·Ð°Ð¿ÑоÑов. Так как libpq в наÑÑоÑÑее вÑÐµÐ¼Ñ Ð½Ðµ позволÑÐµÑ Ð¿ÐµÑедаваÑÑ Ñакие ÑообÑениÑ, ÑÑо возможно ÑолÑко Ñ ÐºÐ»Ð¸ÐµÐ½Ñом, задейÑÑвÑÑÑим не libpq. ÐÑли ÑÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ ÑаÑÑо, Ð¸Ð¼ÐµÐµÑ ÑмÑÑл ÑÑÑановиÑÑ Ð² max_parallel_workers_per_gather 0 в ÑеанÑÐ°Ñ , Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ ÑÑо акÑÑалÑно, ÑÑÐ¾Ð±Ñ ÑиÑÑема не пÑÑалаÑÑ ÑÑÑоиÑÑ Ð¿Ð»Ð°Ð½Ñ, коÑоÑÑе могÑÑ Ð±ÑÑÑ Ð½ÐµÑÑÑекÑÐ¸Ð²Ð½Ñ Ð¿Ñи поÑледоваÑелÑном вÑполнении.
ÐодгоÑовленнÑй опеÑаÑÐ¾Ñ Ð²ÑполнÑеÑÑÑ Ð² конÑÑÑÑкÑии
CREATE TABLE .. AS EXECUTE ... ÐÑа конÑÑÑÑкÑÐ¸Ñ Ð¼ÐµÐ½ÑÐµÑ Ñ Ð°ÑакÑÐµÑ Ð¾Ð¿ÐµÑаÑии Ñ Â«ÑолÑко ÑÑение» на «ÑÑение+запиÑÑ», ÑÑо иÑклÑÑÐ°ÐµÑ Ð¿Ð°ÑаллелÑное вÑполнение ÑÑой опеÑаÑии.ÐÐ»Ñ ÑÑанзакÑии ÑÑÑановлен ÑеÑиализÑемÑй ÑÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð·Ð¾Ð»ÑÑии. ÐбÑÑно ÑÑа ÑиÑÑаÑÐ¸Ñ Ð½Ðµ возникаеÑ, Ñак как пÑи Ñаком ÑÑовне изолÑÑии не ÑÑÑоÑÑÑÑ Ð¿Ð°ÑаллелÑнÑе Ð¿Ð»Ð°Ð½Ñ Ð²ÑполнениÑ. Ðднако она возможна, еÑли ÑÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð·Ð¾Ð»ÑÑии ÑÑанзакÑии менÑеÑÑÑ Ð½Ð° ÑеÑиализÑемÑй поÑле поÑÑÑÐ¾ÐµÐ½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð° и до его вÑполнениÑ.