F.29. pg_overexplain — выгрузка дополнительной информации через команду EXPLAIN #
Модуль pg_overexplain
позволяет расширить возможности команды EXPLAIN
путём добавления новых параметров, чтобы получить дополнительную информацию в выводе. Модуль в первую очередь предназначен не для общего пользования, а для отладки и усовершенствования планировщика. Поскольку этот модуль отображает внутреннюю информацию о структурах данных планировщика, чтобы разобраться в выводе, может потребоваться обращение к исходному коду. Кроме того, вывод, скорее всего, будет изменяться при любом изменении структур данных.
Чтобы использовать модуль, просто загрузите его в процесс сервера. Это можно сделать в отдельном сеансе:
LOAD 'pg_overexplain';
Также можно загрузить его в некоторые или все сеансы, включив pg_overexplain
в переменную session_preload_libraries или shared_preload_libraries в файле postgresql.conf
.
F.29.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.29.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.29.3. Автор #
Роберт Хаас <rhaas@postgresql.org>