F.36. pg_overexplain — вывод дополнительной информации через EXPLAIN#

F.36. pg_overexplain — вывод дополнительной информации через EXPLAIN

F.36. pg_overexplain — вывод дополнительной информации через EXPLAIN #

Модуль pg_overexplain расширяет возможности EXPLAIN путем добавления новых параметров, чтобы получить дополнительную информацию в выводе. Он в основном предназначен для отладки и оптимизации планировщика, а не для общего использования. Поскольку этот модуль отображает внутренние информацию о структурах данных планировщика, для понимания вывода может потребоваться обратиться к исходному коду. Кроме того, вывод, скорее всего, будет меняться всякий раз когда изменяются эти структуры данных.

Чтобы использовать модуль, просто загрузите его в процесс сервера. Вы можете загрузить его в отдельной сессии:

LOAD 'pg_overexplain';

Вы также можете предварительно загрузить его в некоторые или все сессии, добавив pg_overexplain в переменную session_preload_libraries или shared_preload_libraries в postgresql.conf.

F.36.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.36.2. EXPLAIN (RANGE_TABLE) #

Параметр RANGE_TABLE отображает информацию из дерева плана, касающуюся списка отношений запроса. Списки отношений запроса примерно соответствуют элементам, находящимся в предложении FROM запроса, но с некоторыми исключениями. Например, подзапросы, признанные ненужными, могут быть полностью удалены из списка отношений, в то время как расширение наследования добавляет в список записи для дочерних таблиц, которые не указаны напрямую в запросе.

Записи в списке отношений внутри плана запроса обычно ссылаются по индексу списка отношений, или RTI. Узлы плана, которые ссылаются на один или несколько RTI, будут соответствующим образом помечены с помощью одного из следующих полей: Scan RTI, Nominal RTI, Exclude Relation RTI, Append RTIs.

Кроме того, запрос в целом может содержать списки индексов, которые необходимы для различных целей. Эти списки будут отображаться один раз для каждого запроса, с соответствующими метками Unprunable RTIs или Result RTIs. В текстовом режиме эти поля отображаются только в том случае, если они являются непустыми наборами.

Наконец, и что самое важное, опция RANGE_TABLE будет выводить дамп всей таблицы диапазонов (range table) запроса. Каждая запись таблицы диапазонов помечается соответствующим индексом, типом записи таблицы диапазонов (например, relation, subquery или join), за которым следует содержимое различных полей записи таблицы диапазонов, которые обычно не входят в вывод команды EXPLAIN. Некоторые из этих полей отображаются только для определённых типов записей таблицы диапазонов. Например, Eref отображается для всех типов записей, а CTE Name — только для записей типа cte.

Подробнее о записях таблицы диапазонов смотрите в определении RangeTblEntry в nodes/parsenodes.h.

F.36.3. Автор #

Robert Haas