F.43. pg_overexplain â вÑгÑÑзка дополниÑелÑной инÑоÑмаÑии ÑеÑез ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ EXPLAIN #
ÐодÑÐ»Ñ pg_overexplain позволÑÐµÑ ÑаÑÑиÑиÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ EXPLAIN пÑÑÑм Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²ÑÑ
паÑамеÑÑов, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð² вÑводе. ÐодÑÐ»Ñ Ð² пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð¿ÑедназнаÑен не Ð´Ð»Ñ Ð¾Ð±Ñего полÑзованиÑ, а Ð´Ð»Ñ Ð¾Ñладки и ÑÑовеÑÑенÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð»Ð°Ð½Ð¸ÑовÑика. ÐоÑколÑÐºÑ ÑÑÐ¾Ñ Ð¼Ð¾Ð´ÑÐ»Ñ Ð¾ÑобÑÐ°Ð¶Ð°ÐµÑ Ð²Ð½ÑÑÑеннÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ ÑÑÑÑкÑÑÑаÑ
даннÑÑ
планиÑовÑика, ÑÑÐ¾Ð±Ñ ÑазобÑаÑÑÑÑ Ð² вÑводе, Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð¾Ð±ÑаÑение к иÑÑ
Ð¾Ð´Ð½Ð¾Ð¼Ñ ÐºÐ¾Ð´Ñ. ÐÑоме Ñого, вÑвод, ÑкоÑее вÑего, бÑÐ´ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÑÑÑÑÑ Ð¿Ñи лÑбом изменении ÑÑÑÑкÑÑÑ Ð´Ð°Ð½Ð½ÑÑ
.
ЧÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ Ð¼Ð¾Ð´ÑлÑ, пÑоÑÑо загÑÑзиÑе его в пÑоÑеÑÑ ÑеÑвеÑа. ÐÑо можно ÑделаÑÑ Ð² оÑделÑном ÑеанÑе:
LOAD 'pg_overexplain';
Также можно загÑÑзиÑÑ ÐµÐ³Ð¾ в некоÑоÑÑе или вÑе ÑеанÑÑ, вклÑÑив pg_overexplain в пеÑеменнÑÑ session_preload_libraries или shared_preload_libraries в Ñайле postgresql.conf.
F.43.1. EXPLAIN (DEBUG) #
ÐаÑамеÑÑ DEBUG вÑÐ²Ð¾Ð´Ð¸Ñ ÑазлиÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¸Ð· деÑева плана, коÑоÑÐ°Ñ Ð¾Ð±ÑÑно не оÑобÑажаеÑÑÑ, Ñак как не ÑÑебÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÑÑного полÑзоваÑелÑ. ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñзла плана вÑводÑÑÑÑ Ð¿Ð¾Ð»Ñ, опиÑаннÑе ниже. Ðа подÑобноÑÑÑми об ÑÑиÑ
полÑÑ
обÑаÑиÑеÑÑ Ðº ÑÐ°Ð·Ð´ÐµÐ»Ñ Plan в nodes/plannodes.h.
Disabled Nodes. ЧÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ, оÑклÑÑÑн ли Ñзел, в обÑÑном Ñежиме командаEXPLAINпÑовеÑÑеÑ, ÑÑо колиÑеÑÑво оÑклÑÑÑннÑÑ Ñзлов пÑевÑÑÐ°ÐµÑ Ð¾Ð±Ñее колиÑеÑÑво нижележаÑÐ¸Ñ Ñзлов. ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð²ÑÐ²Ð¾Ð´Ð¸Ñ Ð½ÐµÐ¾Ð±ÑабоÑанное знаÑение ÑÑÑÑÑика.Parallel Safe. ÐоказÑваеÑ, безопаÑно ли Ð´Ð»Ñ Ñзла деÑева плана оказаÑÑÑÑ Ð½Ð¸Ð¶Ðµ ÑзлаGatherилиGather Mergeвне завиÑимоÑÑи Ð¾Ñ Ñого, Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð»Ð¸ ÑÑÐ¾Ñ Ñзел ниже на Ñамом деле.Plan Node ID. ÐнÑÑÑенний иденÑиÑикаÑионнÑй номеÑ, коÑоÑÑй должен бÑÑÑ ÑникалÑнÑм Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñзла в деÑеве плана. ÐÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÐºÐ¾Ð¾ÑдиниÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°ÑаллелÑнÑÑ Ð·Ð°Ð¿ÑоÑов.extParamиallParam. ÐнÑоÑмаÑÐ¸Ñ Ð¾ Ñом, какие ÑиÑловÑе паÑамеÑÑÑ Ð²Ð»Ð¸ÑÑÑ Ð½Ð° ÑÑÐ¾Ñ Ñзел плана или его доÑеÑние ÑзлÑ. Ð ÑекÑÑовом Ñежиме ÑÑи Ð¿Ð¾Ð»Ñ Ð¾ÑобÑажаÑÑÑÑ, ÑолÑко еÑли возвÑаÑаÑÑÑÑ Ð½ÐµÐ¿ÑÑÑÑе набоÑÑ.
ÐÐ»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ запÑоÑа паÑамеÑÑ DEBUG бÑÐ´ÐµÑ Ð²ÑводиÑÑ Ð¿Ð¾Ð»Ñ, опиÑаннÑе ниже. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÑÐ°Ð·Ð´ÐµÐ»Ñ PlannedStmt в nodes/plannodes.h.
Command Type. ÐапÑимеÑ,selectилиupdate.Flags. РазделÑннÑй запÑÑÑми ÑпиÑок имÑн Ñленов ÑÑÑÑкÑÑÑÑ Ð¸Ð· ÑазделаPlannedStmt, коÑоÑÑе пÑинимаÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкие знаÑениÑ, Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñм знаÑениемtrue. ÐклÑÑÐ°ÐµÑ ÑледÑÑÑие ÑÐ»ÐµÐ½Ñ ÑÑÑÑкÑÑÑÑ:hasReturning,hasModifyingCTE,canSetTag,transientPlan,dependsOnRoleиparallelModeNeeded.Subplans Needing Rewind. ЦелоÑиÑленнÑе иденÑиÑикаÑоÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½ÑÑ Ð¿Ð»Ð°Ð½Ð¾Ð², Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ ÑÐ¸Ð½Ñ ÑонизаÑÐ¸Ñ Ñо ÑÑоÑÐ¾Ð½Ñ Ð¸ÑполниÑелÑ.Relation OIDs. OID оÑноÑений, Ð¾Ñ ÐºÐ¾ÑоÑÑÑ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ ÑÑÐ¾Ñ Ð¿Ð»Ð°Ð½.Executor Parameter Types. OID Ñипов Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ паÑамеÑÑа иÑполниÑÐµÐ»Ñ (напÑимеÑ, когда вÑбÑан вложеннÑй Ñикл и паÑамеÑÑ Ð¸ÑполÑзÑеÑÑÑ, ÑÑÐ¾Ð±Ñ Ð¿ÐµÑедаÑÑ Ð·Ð½Ð°Ñение Ð´Ð»Ñ Ð²Ð½ÑÑÑеннего ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа). Ðе вклÑÑÐ°ÐµÑ Ð¿Ð°ÑамеÑÑÑ, коÑоÑÑе пеÑедаÑÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелем в подгоÑовленном опеÑаÑоÑе.Parse Location. Ðоложение в ÑÑÑоке запÑоÑа, пеÑедаваемой планиÑовÑикÑ, где можно найÑи ÑекÑÑ ÑÑого запÑоÑа. РнекоÑоÑÑÑ ÐºÐ¾Ð½ÑекÑÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð·Ð½Ð°ÑениеUnknown. РоÑÑалÑнÑÑ ÑлÑÑаÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинимаÑÑ Ð·Ð½Ð°ÑениеNNN to endÐ´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ ÑелÑÑ ÑиÑелNNNилиNNN for MMM bytesÐ´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ ÑелÑÑ ÑиÑелNNNиMMM.
F.43.2. EXPLAIN (RANGE_TABLE) #
ÐаÑамеÑÑ RANGE_TABLE вÑÐ²Ð¾Ð´Ð¸Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¸Ð· деÑева плана, оÑноÑÑÑÑÑÑÑ Ðº ÑпиÑÐºÑ Ð¾ÑноÑений запÑоÑа. ÐапиÑи в ÑÑом ÑпиÑке пÑимеÑно ÑооÑвеÑÑÑвÑÑÑ ÑлеменÑам, наÑ
одÑÑимÑÑ Ð² пÑедложении FROM, но Ñ ÑÑдом иÑклÑÑений. ÐапÑимеÑ, подзапÑоÑÑ, пÑизнаннÑе необÑзаÑелÑнÑми, могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð¸Ð· ÑпиÑка оÑноÑений, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº ÑаÑÑиÑение наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÐµÑ Ð² ÑпиÑок запиÑи Ð´Ð»Ñ Ð´Ð¾ÑеÑниÑ
ÑаблиÑ, не ÑказаннÑÑ
в запÑоÑе напÑÑмÑÑ.
Ðа ÑлеменÑÑ ÑпиÑка оÑноÑений в ÑамкаÑ
плана запÑоÑа ÑÑÑлаÑÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¸Ð½Ð´ÐµÐºÑа ÑпиÑка оÑноÑений (range table index, RTI). Узлам плана, коÑоÑÑе ÑÑÑлаÑÑÑÑ Ð½Ð° один или неÑколÑко RTI, бÑдÑÑ Ð½Ð°Ð·Ð½Ð°ÑÐµÐ½Ñ ÑооÑвеÑÑÑвÑÑÑие меÑки Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ из ÑледÑÑÑиÑ
полей: Scan RTI, Nominal RTI, Exclude Relation RTI и Append RTIs.
ÐÑоме Ñого, запÑÐ¾Ñ Ð² Ñелом Ð¼Ð¾Ð¶ÐµÑ Ñакже ÑодеÑжаÑÑ ÑпиÑки индекÑов, коÑоÑÑе могÑÑ ÑÑебоваÑÑÑÑ Ð´Ð»Ñ ÑазлиÑнÑÑ
Ñелей. ÐÑи ÑпиÑки бÑдÑÑ Ð²ÑводиÑÑÑÑ Ð¾Ð´Ð¸Ð½ Ñаз Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ запÑоÑа Ñ ÑооÑвеÑÑÑвÑÑÑими меÑками Unprunable RTIs или Result RTIs. Ð ÑекÑÑовом Ñежиме ÑÑи Ð¿Ð¾Ð»Ñ Ð¾ÑобÑажаÑÑÑÑ ÑолÑко в Ñом ÑлÑÑае, еÑли они ÑвлÑÑÑÑÑ Ð½ÐµÐ¿ÑÑÑÑми множеÑÑвами.
ÐаконеÑ, ÑÑо Ñамое важное, паÑамеÑÑ RANGE_TABLE бÑÐ´ÐµÑ Ð²ÑводиÑÑ Ð´Ð°Ð¼Ð¿ Ñелого ÑпиÑка оÑноÑений запÑоÑа. ÐаждÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑпиÑка оÑноÑений помеÑен ÑооÑвеÑÑÑвÑÑÑим индекÑом, поÑ
ожим на ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑпиÑка оÑноÑений (напÑимеÑ, relation, subquery или join), за коÑоÑÑм ÑледÑÐµÑ ÑодеÑжимое ÑазлиÑнÑÑ
полей ÑлеменÑа, обÑÑно не вÑводимое командой EXPLAIN. ÐекоÑоÑÑе из ÑÑиÑ
полей возвÑаÑаÑÑÑÑ ÑолÑко Ð´Ð»Ñ Ð¾Ð¿ÑеделÑннÑÑ
ÑлеменÑов ÑпиÑка оÑноÑений. ÐапÑимеÑ, Eref вÑводиÑÑÑ Ð´Ð»Ñ Ð²ÑеÑ
Ñипов ÑлеменÑов, а CTE Name â ÑолÑко Ð´Ð»Ñ ÑлеменÑов Ñипа cte.
Ðа подÑобноÑÑÑми об ÑлеменÑаÑ
ÑпиÑка оÑноÑений обÑаÑиÑеÑÑ Ðº опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ RangeTblEntry в nodes/plannodes.h.
F.43.3. ÐвÑÐ¾Ñ #
РобеÑÑ Ð¥Ð°Ð°Ñ <[email protected]>