48.6. ÐÑполниÑелÑ
ÐÑполниÑÐµÐ»Ñ Ð¿ÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¿Ð»Ð°Ð½, ÑозданнÑй планиÑовÑиком/иÑполниÑелем и обÑабаÑÑÐ²Ð°ÐµÑ ÐµÐ³Ð¾ ÑекÑÑÑивно, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑÑебÑемÑй Ð½Ð°Ð±Ð¾Ñ ÑÑÑок. ÐбÑабоÑка вÑполнÑеÑÑÑ Ð¿Ð¾ конвейеÑÑ, Ñ Ð¿Ð¾Ð»ÑÑением даннÑÑ Ð¿Ð¾ ÑÑебованиÑ. ÐÑи вÑзове лÑбого Ñзла плана он должен вÑдаÑÑ Ð¾ÑеÑеднÑÑ ÑÑÑокÑ, либо ÑообÑиÑÑ, ÑÑо вÑдаÑа ÑÑÑок завеÑÑена.
РкаÑеÑÑве более конкÑеÑного пÑимеÑа, давайÑе пÑедположим, ÑÑо веÑÑ
ним Ñзлом плана оказалÑÑ Ñзел MergeJoin. ÐÐ»Ñ Ñого ÑÑÐ¾Ð±Ñ Ð²ÑполниÑÑ ÐºÐ°ÐºÐ¾Ðµ-либо Ñоединение, необÑ
одимо вÑбÑаÑÑ Ð´Ð²Ðµ ÑÑÑоки (Ð¾Ð´Ð½Ñ Ð¸Ð· каждого вложенного плана). ÐоÑÑÐ¾Ð¼Ñ Ð¸ÑполниÑÐµÐ»Ñ ÑекÑÑÑивно вÑзÑÐ²Ð°ÐµÑ ÑÐµÐ±Ñ Ð´Ð»Ñ Ð¾Ð±ÑабоÑки вложеннÑÑ
планов (он наÑÐ¸Ð½Ð°ÐµÑ Ñ Ð¿Ð»Ð°Ð½Ð° левого деÑева). ÐовÑй веÑÑ
ний Ñзел (веÑÑ
ний Ñзел левого вложенного плана) Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ, напÑимеÑ, Ñзлом Sort, и Ñогда Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð²Ñ
одной ÑÑÑоки Ñнова ÑÑебÑеÑÑÑ ÑекÑÑÑиÑ. ÐоÑеÑним Ñзлом Sort Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ñзел SeqScan, пÑедÑÑавлÑÑÑий ÑобÑÑвенно ÑÑение ÑаблиÑÑ. Ð ÑезÑлÑÑаÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑого Ñзла иÑполниÑÐµÐ»Ñ Ð²ÑбиÑÐ°ÐµÑ Ð¾Ð´Ð½Ñ ÑÑÑÐ¾ÐºÑ Ð¸Ð· ÑаблиÑÑ Ð¸ возвÑаÑÐ°ÐµÑ ÐµÑ Ð²ÑзÑваÑÑÐµÐ¼Ñ ÑзлÑ. Узел Sort, в ÑÐ²Ð¾Ñ Ð¾ÑеÑедÑ, бÑÐ´ÐµÑ Ð¿ÑодолжаÑÑ Ð²ÑзÑваÑÑ Ð´Ð¾ÑеÑний Ñзел, пока не полÑÑÐ¸Ñ Ð²Ñе ÑÑÑоки Ð´Ð»Ñ ÑоÑÑиÑовки. Ðогда ÑÑÑоки законÑаÑÑÑ (доÑеÑний Ñзел ÑообÑÐ¸Ñ Ð¾Ð± ÑÑом, возвÑаÑив NULL вмеÑÑо ÑÑÑоки), Ñзел Sort вÑÐ¿Ð¾Ð»Ð½Ð¸Ñ ÑоÑÑиÑовкÑ, и Ð½Ð°ÐºÐ¾Ð½ÐµÑ ÑÐ¼Ð¾Ð¶ÐµÑ Ð²ÑдаÑÑ ÑÐ²Ð¾Ñ Ð¿ÐµÑвÑÑ ÑÑÑокÑ, а именно ÑÑÑÐ¾ÐºÑ Ð¿ÐµÑвÑÑ Ð¿Ð¾ поÑÑÐ´ÐºÑ ÑоÑÑиÑовки. ÐÑÑалÑнÑе ÑÑÑоки бÑдÑÑ ÑоÑ
ÑанÑÑÑÑÑ Ð² нÑм, ÑÑÐ¾Ð±Ñ Ð¾Ð½ мог вÑдаваÑÑ Ð¸Ñ
по поÑÑÐ´ÐºÑ Ð¿Ñи поÑледÑÑÑиÑ
вÑзоваÑ
.
Узел MergeJoin подобнÑм обÑазом заÑÑебÑÐµÑ Ð¿ÐµÑвÑÑ ÑÑÑÐ¾ÐºÑ Ð¸ Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ð³Ð¾ плана ÑпÑава. ÐаÑем он ÑÑÐ°Ð²Ð½Ð¸Ð²Ð°ÐµÑ Ð´Ð²Ðµ ÑÑÑоки и опÑеделÑеÑ, можно ли иÑ
ÑоединиÑÑ; еÑли да, он возвÑаÑÐ°ÐµÑ ÑоединÑннÑÑ ÑÑÑоки вÑзÑваÑÑÐµÐ¼Ñ ÑзлÑ. ÐÑи ÑледÑÑÑем вÑзове, или немедленно, еÑли он не Ð¼Ð¾Ð¶ÐµÑ ÑоединиÑÑ ÑекÑÑÑÑ Ð¿Ð°ÑÑ Ð¿Ð¾ÑÑÑпивÑиÑ
ÑÑÑок, он пеÑеÑ
Ð¾Ð´Ð¸Ñ Ðº ÑледÑÑÑей ÑÑÑоке в одном оÑноÑении или в дÑÑгом (в завиÑимоÑÑи Ð¾Ñ ÑезÑлÑÑаÑа ÑÑавнениÑ) и Ñнова пÑовеÑÑÐµÑ ÑооÑвеÑÑÑвие. РконÑе конÑов, даннÑе в одном или дÑÑгом вложенном плане заканÑиваÑÑÑÑ Ð¸ Ñзел MergeJoin возвÑаÑÐ°ÐµÑ NULL, показÑÐ²Ð°Ñ Ñем ÑамÑм, ÑÑо дÑÑгие ÑÑÑоки ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð½ÐµÐ»ÑзÑ.
СложнÑе запÑоÑÑ Ð¼Ð¾Ð³ÑÑ ÑодеÑжаÑÑ Ð¼Ð½Ð¾Ð³Ð¾ ÑÑовней вложенноÑÑи Ñзлов плана, но обÑий Ð¿Ð¾Ð´Ñ Ð¾Ð´ ÑÐ¾Ñ Ð¶Ðµ: каждÑй Ñзел вÑÑиÑлÑÐµÑ Ð¸ возвÑаÑÐ°ÐµÑ ÑледÑÑÑÑÑ Ð¿Ð¾Ð»ÑÑеннÑÑ ÑÑÑÐ¾ÐºÑ Ð¿Ñи оÑеÑедном вÑзове. ÐаждÑй Ñзел Ñакже должен пÑоизводиÑÑ Ð¾ÑÐ±Ð¾Ñ Ð¸ ÑаÑÑÑÑÑ, коÑоÑÑе бÑли назнаÑÐµÐ½Ñ ÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑовÑиком.
ÐеÑ
анизм иÑполниÑÐµÐ»Ñ Ð¿ÑименÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÑабоÑки вÑеÑ
ÑеÑÑÑÑÑ
оÑновнÑÑ
Ñипов SQL-запÑоÑов: SELECT, INSERT, UPDATE и DELETE. С SELECT код иÑполниÑÐµÐ»Ñ Ð²ÐµÑÑ
него ÑÑÐ¾Ð²Ð½Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑолÑко вÑдаÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð²Ñе ÑÑÑоки, полÑÑеннÑе Ð¾Ñ Ð´ÐµÑева плана запÑоÑа. ÐапÑоÑÑ INSERT ... SELECT, UPDATE и DELETE по ÑÑÑи вÑполнÑÑÑÑÑ ÐºÐ°Ðº SELECT под ÑпеÑиалÑнÑм Ñзлом ModifyTable на веÑÑ
нем ÑÑовне плана.
Ðоманда INSERT ... SELECT подаÑÑ ÑÑÑоки в Ñзел ModifyTable Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² оÑноÑение. С UPDATE планиÑовÑик Ð´ÐµÐ»Ð°ÐµÑ Ñак, ÑÑÐ¾Ð±Ñ ÐºÐ°Ð¶Ð´Ð°Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð½Ð°Ñ ÑÑÑока вклÑÑала знаÑÐµÐ½Ð¸Ñ Ð²ÑеÑ
изменÑннÑÑ
ÑÑолбÑов плÑÑ TID (Tuple ID, иденÑиÑикаÑÐ¾Ñ ÐºÐ¾ÑÑежа) иÑÑ
одной Ñелевой ÑÑÑоки; ÑÑи даннÑе подаÑÑÑÑ Ð² Ñзел ModifyTable, коÑоÑÑй иÑполÑзÑÐµÑ ÑÑÑ Ð¸Ð½ÑоÑмаÑиÑ, ÑÑÐ¾Ð±Ñ ÑоздаÑÑ Ð½Ð¾Ð²ÑÑ Ð¸Ð·Ð¼ÐµÐ½ÑннÑÑ ÑÑÑÐ¾ÐºÑ Ð¸ помеÑиÑÑ ÑÑаÑÑÑ ÑÑÑÐ¾ÐºÑ ÐºÐ°Ðº ÑдалÑннÑÑ. С DELETE план ÑакÑиÑеÑки возвÑаÑÐ°ÐµÑ ÑолÑко один ÑÑолбеÑ, TID, а Ñзел ModifyTable иÑполÑзÑÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ TID, ÑÑÐ¾Ð±Ñ Ð½Ð°Ð¹Ñи каждÑÑ ÑелевÑÑ ÑÑÑÐ¾ÐºÑ Ð¸ помеÑиÑÑ ÐµÑ ÐºÐ°Ðº ÑдалÑннÑÑ.
ÐÑоÑÑÐ°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° INSERT ... VALUES ÑоздаÑÑ ÑÑивиалÑное деÑево плана, ÑодеÑжаÑее единÑÑвеннÑй Ñзел Result, коÑоÑÑй вÑÑиÑлÑÐµÑ Ñовно Ð¾Ð´Ð½Ñ ÑÑÑÐ¾ÐºÑ ÑезÑлÑÑаÑа и подаÑÑ ÐµÑ Ð² вÑÑеÑÑоÑÑий Ñзел ModifyTable Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² оÑноÑение.