15.4. ÐезопаÑноÑÑÑ ÑаÑпаÑаллеливаниÑ
ÐланиÑовÑик клаÑÑиÑиÑиÑÑÐµÑ Ð¾Ð¿ÐµÑаÑии, вовлеÑÑннÑе в вÑполнение запÑоÑа, как либо безопаÑнÑе Ð´Ð»Ñ ÑаÑпаÑаллеливаниÑ, либо огÑаниÑенно ÑаÑпаÑаллеливаемÑе, либо небезопаÑнÑе Ð´Ð»Ñ ÑаÑпаÑаллеливаниÑ. ÐезопаÑной Ð´Ð»Ñ ÑаÑпаÑÐ°Ð»Ð»ÐµÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑаÑией ÑÑиÑаеÑÑÑ ÑакаÑ, коÑоÑÐ°Ñ Ð½Ðµ меÑÐ°ÐµÑ Ð¿Ð°ÑаллелÑÐ½Ð¾Ð¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. ÐгÑаниÑенно ÑаÑпаÑаллеливаемой опеÑаÑией ÑÑиÑаеÑÑÑ ÑакаÑ, коÑоÑÐ°Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð² паÑаллелÑном ÑабоÑем пÑоÑеÑÑе, но Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑÑÑ Ð² ведÑÑем пÑоÑеÑÑе, когда запÑÐ¾Ñ Ð²ÑполнÑеÑÑÑ Ð¿Ð°ÑаллелÑно. Таким обÑазом, огÑаниÑенно паÑаллелÑнÑе опеÑаÑии никогда не могÑÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð½Ð¸Ð¶Ðµ Ñзла Gather, но могÑÑ Ð²ÑÑÑеÑаÑÑÑÑ Ð² дÑÑгиÑ
меÑÑаÑ
плана Ñ Ñзлом Gather. ÐебезопаÑнÑе Ð´Ð»Ñ ÑаÑпаÑÐ°Ð»Ð»ÐµÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑаÑии не могÑÑ Ð²ÑполнÑÑÑÑÑ Ð² паÑаллелÑнÑÑ
запÑоÑаÑ
, даже в ведÑÑем пÑоÑеÑÑе. Ðогда запÑÐ¾Ñ ÑодеÑÐ¶Ð¸Ñ ÑÑо-либо небезопаÑное Ð´Ð»Ñ ÑаÑпаÑаллеливаниÑ, паÑаллелÑное вÑполнение Ð´Ð»Ñ Ñакого запÑоÑа полноÑÑÑÑ Ð¸ÑклÑÑаеÑÑÑ.
ÐгÑаниÑенно ÑаÑпаÑаллеливаемÑми вÑегда ÑÑиÑаÑÑÑÑ ÑледÑÑÑие опеÑаÑии:
СканиÑование обÑÐ¸Ñ ÑаблиÑнÑÑ Ð²ÑÑажений (CTE).
СканиÑование вÑеменнÑÑ ÑаблиÑ.
СканиÑование ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ ÑаблиÑ, еÑли ÑолÑко обÑÑÑка ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð½Ðµ пÑедоÑÑавлÑÐµÑ ÑÑнкÑиÑ
IsForeignScanParallelSafe, коÑоÑÐ°Ñ Ð´Ð¾Ð¿ÑÑÐºÐ°ÐµÑ ÑаÑпаÑаллеливание.ÐоÑÑÑп к
InitPlanилиSubPlan.
15.4.1. ÐомеÑки паÑаллелÑноÑÑи Ð´Ð»Ñ ÑÑнкÑий и агÑегаÑов
ÐланиÑовÑик не Ð¼Ð¾Ð¶ÐµÑ Ð°Ð²ÑомаÑиÑеÑки опÑеделиÑÑ, ÑвлÑеÑÑÑ Ð»Ð¸ полÑзоваÑелÑÑÐºÐ°Ñ Ð¾Ð±ÑÑÐ½Ð°Ñ Ð¸Ð»Ð¸ агÑегаÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñной Ð´Ð»Ñ ÑаÑпаÑаллеливаниÑ, Ñак как ÑÑо поÑÑебовало Ð±Ñ Ð¿ÑедÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ опеÑаÑии, коÑоÑÑÑ Ð¼Ð¾Ð³Ð»Ð° Ð±Ñ Ð²ÑполнÑÑÑ ÑÑнкÑиÑ. РобÑем ÑлÑÑае ÑÑо ÑавнознаÑно ÑеÑÐµÐ½Ð¸Ñ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð¾ÑÑановки, а знаÑиÑ, невозможно. Ðаже Ð´Ð»Ñ Ð¿ÑоÑÑÑÑ
ÑÑнкÑий, где ÑÑо в пÑинÑипе возможно, Ð¼Ñ Ð½Ðµ пÑÑаемÑÑ ÑÑо делаÑÑ, Ñак как ÑÑо бÑÐ´ÐµÑ ÑлиÑком доÑогой и поÑенÑиалÑно неÑоÑной пÑоÑедÑÑой. ÐмеÑÑо ÑÑого, вÑе опÑеделÑемÑе полÑзоваÑелем ÑÑнкÑии полагаÑÑÑÑ Ð½ÐµÐ±ÐµÐ·Ð¾Ð¿Ð°ÑнÑми Ð´Ð»Ñ ÑаÑпаÑаллеливаниÑ, еÑли Ñвно не оÑмеÑено обÑаÑное. Ðогда иÑполÑзÑеÑÑÑ CREATE FUNCTION или ALTER FUNCTION, ÑÑнкÑии можно назнаÑиÑÑ Ð¾ÑмеÑÐºÑ PARALLEL SAFE, PARALLEL RESTRICTED или PARALLEL UNSAFE, оÑÑажаÑÑÑÑ ÐµÑ Ñ
аÑакÑеÑ. Ркоманде CREATE AGGREGATE Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа PARALLEL можно задаÑÑ SAFE, RESTRICTED или UNSAFE в виде ÑооÑвеÑÑÑвÑÑÑего знаÑениÑ.
ÐбÑÑнÑе и агÑегаÑнÑе ÑÑнкÑии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð¼ÐµÑаÑÑÑÑ Ð½ÐµÐ±ÐµÐ·Ð¾Ð¿Ð°ÑнÑми Ð´Ð»Ñ ÑаÑпаÑÐ°Ð»Ð»ÐµÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ (PARALLEL UNSAFE), еÑли они пиÑÑÑ Ð² Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, обÑаÑаÑÑÑÑ Ðº поÑледоваÑелÑноÑÑÑм, изменÑÑÑ ÑоÑÑоÑние ÑÑанзакÑии, даже вÑеменно (как, напÑимеÑ, ÑÑнкÑÐ¸Ñ PL/pgsql, ÑÑÑанавливаÑÑÐ°Ñ Ð±Ð»Ð¾Ðº EXCEPTION Ð´Ð»Ñ Ð¿ÐµÑеÑ
ваÑа оÑибок), либо пÑоизводÑÑ Ð¿Ð¾ÑÑоÑннÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð°ÑамеÑÑов. ÐодобнÑм обÑазом, ÑÑнкÑии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿Ð¾Ð¼ÐµÑаÑÑÑÑ ÐºÐ°Ðº огÑаниÑенно ÑаÑпаÑаллеливаемÑе (PARALLEL RESTRICTED), еÑли они обÑаÑаÑÑÑÑ Ðº вÑеменнÑм ÑаблиÑам, ÑоÑÑоÑÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑкого подклÑÑениÑ, кÑÑÑоÑам, подгоÑовленнÑм опеÑаÑоÑам или ÑазнообÑÐ°Ð·Ð½Ð¾Ð¼Ñ Ð»Ð¾ÐºÐ°Ð»ÑÐ½Ð¾Ð¼Ñ ÑоÑÑоÑÐ½Ð¸Ñ Ð¾Ð±ÑлÑживаÑÑего пÑоÑеÑÑа, коÑоÑое ÑиÑÑема не Ð¼Ð¾Ð¶ÐµÑ ÑинÑ
ÑонизиÑоваÑÑ Ð¼ÐµÐ¶Ð´Ñ ÑабоÑими пÑоÑеÑÑами. ÐапÑимеÑ, по ÑÑой пÑиÑине огÑаниÑенно паÑаллелÑнÑми ÑвлÑÑÑÑÑ ÑÑнкÑии setseed и random.
Ð Ñелом, еÑли ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð¼ÐµÑена как безопаÑнаÑ, когда на Ñамом деле она небезопаÑна или огÑаниÑенно безопаÑна, или еÑли она помеÑена как огÑаниÑенно безопаÑнаÑ, когда на Ñамом деле она небезопаÑнаÑ, ÑÐ°ÐºÐ°Ñ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑдаваÑÑ Ð¾Ñибки или возвÑаÑаÑÑ Ð½ÐµÐ¿ÑавилÑнÑе оÑвеÑÑ Ð¿Ñи иÑполÑзовании в паÑаллелÑном запÑоÑе. ФÑнкÑии на ÑзÑке C могÑÑ ÑеоÑеÑиÑеÑки пÑоÑвлÑÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð½ÐµÐ¾Ð¿ÑеделÑнное поÑвление пÑи некоÑÑекÑной помеÑке, Ñак как ÑиÑÑема никаким обÑазом не Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°ÑиÑиÑÑ ÑÐµÐ±Ñ Ð¾Ñ Ð¿ÑоизволÑного кода C, но ÑаÑе вÑего ÑезÑлÑÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð½Ðµ Ñ
Ñже, Ñем Ñ Ð»Ñбой дÑÑгой ÑÑнкÑией. Ð ÑлÑÑае Ñомнений, веÑоÑÑно, лÑÑÑе вÑего бÑÐ´ÐµÑ Ð¿Ð¾Ð¼ÐµÑаÑÑ ÑÑнкÑии как небезопаÑнÑе (UNSAFE).
ÐÑли ÑÑнкÑиÑ, вÑполнÑÐµÐ¼Ð°Ñ Ð² паÑаллелÑном ÑабоÑем пÑоÑеÑÑе, заÑÑебÑÐµÑ Ð±Ð»Ð¾ÐºÐ¸Ñовки, коÑоÑÑми не Ð²Ð»Ð°Ð´ÐµÐµÑ Ð²ÐµÐ´ÑÑий, напÑимеÑ, обÑаÑаÑÑÑ Ðº ÑаблиÑе, не ÑпомÑнÑÑой в запÑоÑе, ÑÑи блокиÑовки бÑдÑÑ Ð¾ÑÐ²Ð¾Ð±Ð¾Ð¶Ð´ÐµÐ½Ñ Ð¿Ð¾ завеÑÑении пÑоÑеÑÑа, а не в конÑе ÑÑанзакÑии. ÐÑли Ð²Ñ ÑазÑабаÑÑваеÑе ÑÑнкÑÐ¸Ñ Ñ Ñаким поведением, и ÑÑа оÑобенноÑÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾ÐºÐ°Ð·ÑваеÑÑÑ ÐºÑиÑиÑной, помеÑÑÑе ÑакÑÑ ÑÑнкÑÐ¸Ñ ÐºÐ°Ðº PARALLEL RESTRICTED, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð° вÑполнÑлаÑÑ ÑолÑко в ведÑÑем пÑоÑеÑÑе.
ÐамеÑÑÑе, ÑÑо планиÑовÑик запÑоÑов не ÑаÑÑмаÑÑÐ¸Ð²Ð°ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¾Ñложенного вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð³ÑаниÑенно ÑаÑпаÑаллеливаемÑÑ
обÑÑнÑÑ
или агÑегаÑнÑÑ
ÑÑнкÑий, задейÑÑвованнÑÑ
в запÑоÑе, Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð»ÑÑÑего плана. ÐоÑÑомÑ, напÑимеÑ, еÑли пÑедложение WHERE, пÑименÑемое к конкÑеÑной ÑаблиÑе, ÑвлÑеÑÑÑ Ð¾Ð³ÑаниÑенно паÑаллелÑнÑм, планиÑовÑик запÑоÑов не бÑÐ´ÐµÑ Ð¿Ð¾Ð¼ÐµÑаÑÑ ÑканиÑование ÑÑой ÑаблиÑÑ Ð¿Ð¾Ð´ Ñзел Gather. РнекоÑоÑÑÑ
ÑлÑÑаÑÑ
возможно (и, веÑоÑÑно, более ÑÑÑекÑивно) вклÑÑиÑÑ ÑканиÑование ÑÑой ÑаблиÑÑ Ð² паÑаллелÑнÑÑ ÑаÑÑÑ Ð·Ð°Ð¿ÑоÑа и оÑложиÑÑ Ð²ÑÑиÑление пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¾ пÑоиÑÑ
одило над Ñзлом Gather, но планиÑовÑик ÑÑого не делаеÑ.