×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

6.1.146. EXPLAIN

6.1.146. EXPLAIN

EXPLAIN — вывести план выполнения оператора

Синтаксис

EXPLAIN [ ( option [, ...] ) ] оператор

где option может принимать одно из следующих значений:

    ANALYZE [ boolean ]
    VERBOSE [ boolean ]
    COSTS [ boolean ]
    SETTINGS [ boolean ]
    GENERIC_PLAN [ boolean ]
    BUFFERS [ boolean ]
    SERIALIZE [ { NONE | TEXT | BINARY } ]
    журнал предварительной записи [ boolean ]
    TIMING [ boolean ]
    SUMMARY [ boolean ]
    MEMORY [ boolean ]
    FORMAT { TEXT | XML | JSON | YAML }

Описание

Данная команда отображает план выполнения, который Digital Q.DataBase планировщик формирует для указанного оператора. План выполнения показывает, каким образом таблицы, на которые ссылается оператор, будут сканироваться — посредством обычного последовательного сканирования, сканирования индекса и т. д. — а если указано несколько таблиц — какие алгоритмы соединения будут использованы для объединения необходимых строк из каждой входной таблицы.

Наиболее важной частью вывода является оценочная стоимость выполнения оператора, представляющая собой предположение планировщика о том, сколько времени займет выполнение запроса (измеряется в условных единицах стоимости, которые традиционно приравниваются к операциям чтения дисковых страниц). Фактически отображаются два числа: затраты на запуск до момента получения первой строки и общие затраты на получение всех строк. Для большинства запросов значение имеют общие затраты, но в таких контекстах, как подзапрос в EXISTS, планировщик выберет наименьшие затраты на запуск вместо наименьших общих затрат (так как исполнитель в любом случае остановится после получения одной строки). Кроме того, если количество возвращаемых строк ограничивается с помощью предложения LIMIT , планировщик выполняет соответствующую интерполяцию между стоимостными оценками в конечных точках, чтобы определить наиболее экономичный план.

Параметр ANALYZE инициирует фактическое выполнение оператора, а не только построение плана. В этом случае в отчет добавляется статистика фактического времени выполнения, включая общее время, затраченное в каждом узле плана (в миллисекундах), и общее количество строк, фактически возвращенных этим узлом. Это позволяет определить, насколько оценки планировщика близки к реальности.

Важно

Следует учитывать, что оператор фактически выполняется в случае использования ANALYZE команда фактически выполняется. Хотя EXPLAIN отбрасывает любые выходные данные, которые мог бы вернуть SELECT , в то время как другие побочные эффекты оператора будут проявляться в обычном режиме. Если требуется выполнить EXPLAIN ANALYZE для операторов INSERT, UPDATE, DELETE, MERGE, CREATE TABLE AS, или EXECUTE оператор без влияния команды на данные, используйте следующий подход:

BEGIN;
EXPLAIN ANALYZE ...;
ROLLBACK;

Параметры

ANALYZE

Выполнить команду и вывести фактическое время выполнения и прочую статистику. По умолчанию этот параметр имеет значение FALSE.

VERBOSE

Вывести дополнительную информацию о плане. В частности, включить список выходных столбцов для каждого узла в дереве плана, дополнить имена таблиц и функций именами схем, всегда помечать переменные в выражениях псевдонимом их таблицы и выводить имя каждого триггера, для которого отображается статистика. Идентификатор запроса также будет выведен, если он был вычислен, см. compute_query_id для получения более подробной информации. Значение этого параметра по умолчанию — FALSE.

COSTS

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

SETTINGS

Включить информацию о параметрах конфигурации. В частности, включить параметры, влияющие на планирование запросов, значения которых отличаются от встроенных значений по умолчанию. Значение этого параметра по умолчанию — FALSE.

GENERIC_PLAN

Разрешить оператору содержать заполнители параметров, такие как $1, и сгенерировать общий план, который не зависит от значений этих параметров. См. PREPARE для получения подробных сведений об общих планах и типах операторов, поддерживающих параметры. Этот параметр нельзя использовать вместе с ANALYZE. По умолчанию используется FALSE.

BUFFERS

Включает информацию об использовании буферов. В частности, выводится количество попаданий (hit), чтений (read), загрязнений (dirtied) и записей (written) для разделяемых блоков; количество попаданий, чтений, загрязнений и записей для локальных блоков; количество чтений и записей для временных блоков, а также время, затраченное на чтение и запись блоков файлов данных, локальных блоков и блоков временных файлов (в миллисекундах), если track_io_timing включен. Попадание означает, что чтения удалось избежать, так как блок уже находился в кеше в момент обращения. Разделяемые блоки содержат данные обычных таблиц и индексов; локальные блоки содержат данные временных таблиц и индексов; временные блоки содержат краткосрочные рабочие данные, используемые при сортировке, хешировании, в узлах плана Materialize и аналогичных операциях. Количество блоков изменённых указывает количество ранее неизменённых блоков, которые были изменены данным запросом; в то время как количество блоков записанных указывает количество ранее изменённых блоков, вытесненных из кеша данным серверным процессом в ходе выполнения запроса. Количество блоков, отображаемое для узла верхнего уровня, включает блоки, использованные всеми его дочерними узлами. В текстовом формате выводятся только ненулевые значения. Значение этого параметра по умолчанию — FALSE.

SERIALIZE

Включить информацию о стоимости сериализации выходных данных запроса, то есть их преобразования в текстовый или бинарный формат для отправки клиенту. Это может составлять значительную часть времени, требуемого для обычного выполнения запроса, если функции вывода типов данных являются ресурсоёмкими или если TOAST-значения должны быть извлечены из внешнего хранилища. EXPLAINповедение по умолчанию, SERIALIZE NONE, не выполняет эти преобразования. Если SERIALIZE TEXT или SERIALIZE BINARY указано, выполняются соответствующие преобразования и измеряется затраченное на них время (если только не TIMING OFF указано). Если параметр BUFFERS также указан, то любые обращения к буферам, участвующие в преобразованиях, также учитываются. Однако ни в коем случае EXPLAIN не будет фактически отправлять результирующие данные клиенту; поэтому таким способом нельзя исследовать затраты на сетевую передачу. Сериализация может быть включена только в том случае, если ANALYZE также включен. Если SERIALIZE записано без аргумента, TEXT подразумевается.

журнал предварительной записи

Включить информацию о формировании записей журнала предварительной записи. В частности, включить количество записей, количество полных образов страниц (fpi) и объём журнала предварительной записи в байтах. В текстовом формате выводятся только ненулевые значения. Этот параметр может использоваться только в том случае, когда ANALYZE также включён. По умолчанию он принимает значение FALSE.

TIMING

Включать в вывод фактическое время запуска и время, затраченное в каждом узле. Накладные расходы на многократное чтение системных часов могут значительно замедлить выполнение запроса в некоторых системах, поэтому может быть полезно установить данный параметр в значение FALSE , когда требуются только фактические показатели количества строк, а не точное время. Общее время выполнения оператора измеряется всегда, даже если хронометраж на уровне узлов отключён данной опцией. Этот параметр может использоваться только в том случае, когда ANALYZE также включён. По умолчанию он принимает значение TRUE.

SUMMARY

Включить сводную информацию (например, итоговые данные о времени) после плана запроса. Сводная информация включается по умолчанию, когда ANALYZE используется; в противном случае она не выводится по умолчанию, но может быть включена с помощью этой опции. Время планирования в EXPLAIN EXECUTE включает время, необходимое для извлечения плана из кеша, и время, затраченное на повторное планирование, если оно необходимо.

MEMORY

Включает информацию о потреблении памяти на этапе планирования запроса. В частности, указывается точный объем памяти, используемый внутренними структурами планировщика, а также общий объем памяти с учетом накладных расходов на выделение. По умолчанию этот параметр имеет значение FALSE.

FORMAT

Задает формат вывода: TEXT, XML, JSON или YAML. Нетекстовый вывод содержит ту же информацию, что и формат TEXT, но он проще для программного разбора. Значение этого параметра по умолчанию — TEXT.

boolean

Определяет, должна ли выбранная опция быть включена или выключена. Можно указать TRUE, ONили 1 для включения опции, и FALSE, OFFили 0 для ее выключения. Значение boolean также может быть опущено, и в этом случае TRUE подразумевается.

оператор

Любой SELECT, INSERT, UPDATE, DELETE, MERGE, VALUES, EXECUTE, DECLARE, CREATE TABLE ASили CREATE MATERIALIZED VIEW AS оператор, план выполнения которого необходимо просмотреть.

Выводит

Результатом выполнения команды является текстовое описание плана, выбранного для оператор, опционально дополненное статистикой выполнения. Раздел 2.11.1 описывает предоставляемую информацию.

Примечания

Для того чтобы Digital Q.DataBase планировщик запросов мог принимать обоснованные решения при оптимизации запросов, pg_statistic данные должны быть актуальными для всех таблиц, участвующих в запросе. Как правило, демон autovacuum выполняет это автоматически. Но если содержимое таблицы недавно претерпело существенные изменения, может потребоваться ручное выполнение ANALYZE вместо того чтобы ждать, пока autovacuum обработает эти изменения.

Для измерения стоимости времени выполнения каждого узла в плане выполнения текущая реализация EXPLAIN ANALYZE вносит дополнительные накладные расходы на профилирование в процесс выполнения запроса. В результате выполнение EXPLAIN ANALYZE команды для запроса иногда может занимать значительно больше времени, чем обычное выполнение запроса. Величина накладных расходов зависит от характера запроса, а также от используемой платформы. Наихудший случай наблюдается для тех узлов плана, выполнение которых само по себе занимает очень мало времени, и на машинах с относительно медленными системными вызовами для получения времени суток.

Примеры

Чтобы просмотреть план простого запроса к таблице с одним integer столбцом и 10000 строками:

EXPLAIN SELECT * FROM foo;

                       QUERY PLAN
---------------------------------------------------------
 Seq Scan on foo  (cost=0.00..155.00 rows=10000 width=4)
(1 row)

Тот же запрос с использованием формата вывода JSON:

EXPLAIN (FORMAT JSON) SELECT * FROM foo;
           QUERY PLAN
--------------------------------
 [                             +
   {                           +
     "Plan": {                 +
       "Тип узла": "Seq Scan",+
       "Имя отношения": "foo", +
       "Псевдоним": "foo",         +
       "Затраты на запуск": 0.00,   +
       "Общие затраты": 155.00,   +
       "Строки плана": 10000,     +
       "Ширина плана": 4         +
     }                         +
   }                           +
 ]
(1 строка)

Если индекс существует и в запросе используется индексируемое WHERE условие, EXPLAIN может быть выведен другой план:

EXPLAIN SELECT * FROM foo WHERE i = 4;

                         ПЛАН ЗАПРОСА
--------------------------------------------------------------
 Index Scan using fi on foo  (cost=0.00..5.98 rows=1 width=4)
   Index Cond: (i = 4)
(2 строки)

Тот же запрос в формате YAML:

EXPLAIN (FORMAT YAML) SELECT * FROM foo WHERE i='4';
          QUERY PLAN
-------------------------------
 - Plan:                      +
     Тип узла: "Index Scan"  +
     Scan Direction: "Forward"+
     Index Name: "fi"         +
     Имя отношения: "foo"     +
     Псевдоним: "foo"             +
     Затраты на запуск: 0.00       +
     Общие затраты: 5.98         +
     Строки плана: 1             +
     Ширина плана: 4            +
     Условие индекса: "(i = 4)"
(1 строка)

Формат XML оставлен для самостоятельного изучения читателем.

Ниже представлен тот же план без вывода оценок затрат:

EXPLAIN (COSTS FALSE) SELECT * FROM foo WHERE i = 4;

        QUERY PLAN
----------------------------
 Index Scan с использованием fi по foo
   Условие индекса: (i = 4)
(2 строки)

Ниже приведен пример плана выполнения для запроса с использованием агрегатной функции:

EXPLAIN SELECT sum(i) FROM foo WHERE i < 10;

                             ПЛАН ЗАПРОСА
-------------------------------------------------------------------​--
 Aggregate  (cost=23.93..23.93 rows=1 width=4)
   ->  Index Scan using fi on foo  (cost=0.00..23.92 rows=6 width=4)
         Условие индекса: (i < 10)
(3 строки)

Ниже приведен пример использования EXPLAIN EXECUTE для вывода плана выполнения подготовленного запроса:

PREPARE query(int, int) AS SELECT sum(bar) FROM test
    WHERE id > $1 AND id < $2
    GROUP BY foo;

EXPLAIN ANALYZE EXECUTE query(100, 200);

                                                       QUERY PLAN
-------------------------------------------------------------------​ ------------------------------------------------------
 HashAggregate  (cost=10.77..10.87 rows=10 width=12) (actual time=0.043..0.044 rows=10 loops=1)
   Ключ группировки: foo
   Batches: 1  Memory Usage: 24kB
   ->  Index Scan using test_pkey on test  (cost=0.29..10.27 rows=99 width=8) (actual time=0.009..0.025 rows=99 loops=1)
         Index Cond: ((id > 100) AND (id < 200))
 Planning Time: 0.244 ms
 Execution Time: 0.073 ms
(7 rows)

Разумеется, конкретные значения, приведенные здесь, зависят от фактического содержимого соответствующих таблиц. Также следует учитывать, что эти значения и даже выбранная стратегия выполнения запроса могут меняться между Digital Q.DataBase версиями вследствие улучшений планировщика. Кроме того, ANALYZE команда использует случайную выборку для оценки статистических данных; следовательно, оценки стоимости могут измениться после очередного запуска ANALYZE, даже если фактическое распределение данных в таблице не изменилось.

Обратите внимание, что в предыдущем примере был показан «индивидуальный» план для конкретных значений параметров, указанных в EXECUTE. Также может возникнуть необходимость просмотреть общий план для параметризованного запроса, что можно сделать с помощью GENERIC_PLAN:

EXPLAIN (GENERIC_PLAN)
  SELECT sum(bar) FROM test
    WHERE id > $1 AND id < $2
    GROUP BY foo;

                                  QUERY PLAN
-------------------------------------------------------------------​ ------------
 HashAggregate  (cost=26.79..26.89 rows=10 width=12)
   Ключ группировки: foo
   ->  Index Scan using test_pkey on test  (cost=0.29..24.29 rows=500 width=8)
         Index Cond: ((id > $1) AND (id < $2))
(4 строки)

В данном случае парсер корректно определил, что $1 и $2 должны иметь тот же тип данных, что и id, поэтому отсутствие информации о типах параметров в PREPARE не создало проблем. В других случаях может потребоваться явно указать типы для символов параметров, что можно сделать с помощью приведения типов, например:

EXPLAIN (GENERIC_PLAN)
  SELECT sum(bar) FROM test
    WHERE id > $1::integer AND id < $2::integer
    GROUP BY foo;

Совместимость

В стандарте SQL оператор EXPLAIN не определен.

Следующий синтаксис использовался до Digital Q.DataBase версии 9.0 и до сих пор поддерживается:

EXPLAIN [ ANALYZE ] [ VERBOSE ] оператор

Обратите внимание, что в данном синтаксисе параметры должны быть указаны строго в приведенном порядке.

См. также

ANALYZE
Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению