pg_overexplain — позволяет EXPLAIN выводить еще больше подробностей
Модуль pg_overexplain расширяет EXPLAIN новыми опциями, обеспечивающими дополнительный вывод. Он в основном предназначен для помощи в отладке и разработке планировщика, а не для общего использования. Поскольку этот модуль отображает внутренние детали структур данных планировщика, для понимания вывода может потребоваться обратиться к исходному коду. Кроме того, вывод, вероятно, будет меняться всякий раз (и так часто, как) изменяются эти структуры данных.
Чтобы использовать его, просто загрузите его на сервер. Загрузить его в отдельную сессию можно следующим образом:
LOAD 'pg_overexplain';
Также можно предварительно загрузить его в некоторые или все сессии, включив pg_overexplain в session_preload_libraries или shared_preload_libraries в postgresql.conf.
EXPLAIN (DEBUG)
Опция DEBUG отображает различную информацию из дерева плана, которая обычно не отображается, поскольку не предполагается, что она представляет общий интерес. Для каждого отдельного узла плана будут отображаться следующие поля. Дополнительную информацию об этих полях смотрите в разделе «План» в файле nodes/plannodes.h.
- Отключенные узлы. Обычная команда
EXPLAINопределяет, отключен ли узел, проверяя, превышает ли количество отключенных узлов в узле сумму количества отключенных узлов в базовых узлах. Эта опция отображает исходное значение счетчика. - Параллельная безопасность. Указывает, безопасно ли для узла дерева плана отображаться под узлом «Сбор» или «Слияние сбора», независимо от того, находится ли он фактически под таким узлом.
- Идентификатор узла плана. Внутренний идентификационный номер, который должен быть уникальным для каждого узла в дереве плана. Он используется для координации параллельной работы с запросами.
extParamиallParam. Информация о том, какие пронумерованные параметры влияют на этот узел плана или его дочерние узлы. В текстовом режиме эти поля отображаются только в том случае, если они не являются пустыми наборами.
Один раз для каждого запроса опция DEBUG отобразит следующие поля. Дополнительную информацию смотрите в разделе «PlannedStmt» в файле nodes/plannodes.h.
- Тип команды. Например,
selectилиupdate. - Флаги. Список имен логических элементов структуры из PlannedStmt, разделенных запятыми, которые установлены в значение
true. Он охватывает следующие элементы структуры:hasReturning,hasModifyingCTE,canSetTag,transientPlan,dependsOnRole,parallelModeNeeded. - Подпланы, требующие перемотки. Целочисленные идентификаторы подпланов, которые могут потребовать перемотки исполнителем.
- Идентификаторы отношений. Идентификаторы отношений, от которых зависит данный план.
- Типы параметров исполнителя. Идентификатор типа для каждого параметра исполнителя (например, когда выбран вложенный цикл и параметр используется для передачи значения при сканировании внутреннего индекса). Не включает параметры, предоставленные пользователем в подготовленном запросе.
- Местоположение в строке запроса, предоставленной планировщику, где можно найти текст этого запроса. В некоторых контекстах может быть неизвестно. В противном случае, возможно, NNN в конце для некоторого целого числа NNN или NNN для MMM байтов для некоторых целых чисел NNN и MMM.
EXPLAIN (RANGE_TABLE)
Опция RANGE_TABLE отображает информацию из дерева плана, относящуюся непосредственно к таблице диапазонов запроса. Записи таблицы диапазонов примерно соответствуют элементам, появляющимся в предложении FROM запроса, но с многочисленными исключениями. Например, подзапросы, которые оказались ненужными, могут быть полностью удалены из таблицы диапазонов, в то время как расширение наследования добавляет записи таблицы диапазонов для дочерних таблиц, которые не указаны непосредственно в запросе.
Записи таблицы диапазонов обычно ссылаются в плане запроса с помощью индекса таблицы диапазонов (RTI). Узлы плана, которые ссылаются на один или несколько RTI, будут соответствующим образом помечены с использованием одного из следующих полей: Scan RTI, Nominal RTI, Exclude Relation RTI, Append RTIs.
Кроме того, запрос в целом может поддерживать списки индексов таблицы диапазонов, необходимых для различных целей. Эти списки будут отображаться один раз для каждого запроса, с соответствующими метками «Unprunable RTIs» или «Result RTIs». В текстовом режиме эти поля отображаются только в том случае, если они представляют собой непустые множества.
Наконец, что наиболее важно, опция RANGE_TABLE отобразит дамп всей таблицы диапазонов запроса. Каждая запись таблицы диапазонов помечена соответствующим индексом таблицы диапазонов, типом записи таблицы диапазонов (например, отношение, подзапрос или соединение), а также содержимым различных полей записи таблицы диапазонов, которые обычно не входят в вывод EXPLAIN. Некоторые из этих полей отображаются только для определенных типов записей таблицы диапазонов. Например, Eref отображается для всех типов записей таблицы диапазонов, а CTE Name — только для записей таблицы диапазонов типа cte.
Дополнительную информацию о записях таблицы диапазонов смотрите в определении RangeTblEntry в nodes/parsenodes.h.