PostgreSQL EXPLAIN

EXPLAIN очень полезен для понимания производительности запроса Postgres. Он возвращает план выполнения, созданный планировщиком запросов PostgreSQL для данного оператора. Команда EXPLAIN указывает, будет ли поиск таблиц, на которые ссылается оператор, с использованием сканирования индекса или последовательного сканирования.

Введение в оператор EXPLAIN PostgreSQL

Оператор EXPLAINвозвращает план выполнения, который планировщик PostgreSQL генерирует для данного оператора.

Показывает EXPLAIN, как таблицы, участвующие в операторе, будут сканироваться с помощью индексного сканирования или последовательного сканирования и т. д., а если используется несколько таблиц, какой алгоритм соединения будет использоваться.

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

Ниже показан синтаксис оператора EXPLAIN:

EXPLAIN [ ( option [, ...] ) ] sql_statement;
Язык кода:  CSS  ( css )

где optionможет быть одно из следующего:

ANALYZE [ boolean ]
VERBOSE [ boolean ]
COSTS [ boolean ]
BUFFERS [ boolean ]
TIMING [ boolean ]  
SUMMARY [ boolean ]
FORMAT { TEXT | XML | JSON | YAML }
Язык кода:  JavaScript  ( javascript )

Указывает boolean, следует ли включить или выключить выбранную опцию. Вы можете использовать TRUE, ON, или 1для включения опции и FALSE, OFF, или 0для ее отключения. Если вы опустите логическое значение, по умолчанию будет ON.

ANALYZE

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

Оператор ANALYZEвыполняет оператор SQL и отбрасывает выходную информацию, поэтому, если вы хотите проанализировать любой оператор INSERT, например UPDATE, или , DELETEне затрагивая данные, вам следует обернуть его EXPLAIN ANALYZEв транзакцию следующим образом:

BEGIN;
    EXPLAIN ANALYZE sql_statement;
ROLLBACK;

VERBOSE

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

COSTS

Опция COSTSвключает в себя предполагаемые начальные и общие затраты каждого узла плана, а также предполагаемое количество строк и предполагаемую ширину каждой строки в плане запроса. Значения COSTSпо умолчанию — TRUE.

BUFFERS

Этот параметр добавляет информацию об использовании буфера. BUFFERSможет использоваться только при ANALYZEвключении. По умолчанию BUFFERSпараметр установлен на FALSE.

TIMING

Этот параметр включает фактическое время запуска и время, проведенное в каждом узле в выходных данных. TIMINGПо умолчанию TRUEи его можно использовать только при ANALYZEвключении.

SUMMARY

Параметр SUMMARYдобавляет сводную информацию, такую ​​как общее время после плана запроса. Обратите внимание, что при ANALYZEиспользовании параметра сводная информация включается по умолчанию.

ФОРМАТ

Укажите формат вывода плана запроса, например TEXT, XML, JSON, , и YAML. Этот параметр установлен TEXTпо умолчанию.

Примеры PostgreSQL EXPLAIN

Следующий оператор показывает план простого запроса к filmтаблице:

EXPLAIN SELECT * FROM film;

Вывод следующий:

PostgreSQL EXPLAIN — показывает план простого запроса

В следующем примере показан план запроса, который возвращает фильм по определенному film_id.

EXPLAIN SELECT * FROM film WHERE film_id = 100;

Вот что получилось:

PostgreSQL EXPLAIN — показывает план запроса с индексом

Поскольку film_idиндексируется, оператор вернул другой план. В выходных данных планировщик использовал сканирование индекса вместо последовательного сканирования таблицы film.

Чтобы снизить стоимость, можно воспользоваться COSTSопцией:

EXPLAIN (COSTS FALSE) SELECT
    *
FROM
    film
WHERE
    film_id = 100;
Язык кода:  PHP  ( php )

PostgreSQL EXPLAIN - показывает план без затрат

В следующем примере показан план запроса, использующего агрегатную функцию:

EXPLAIN SELECT COUNT(*) FROM film;

Вывод:

PostgreSQL EXPLAIN — показывает план с агрегатной функцией

Следующий пример возвращает план для оператора, объединяющего несколько таблиц:

EXPLAIN
SELECT
    f.film_id,
    title,
    name category_name
FROM
    film f
    INNER JOIN film_category fc 
        ON fc.film_id = f.film_id
    INNER JOIN category c 
        ON c.category_id = fc.category_id
ORDER BY
    title;

Вывод:

PostgreSQL EXPLAIN — показывает план соединения

Чтобы добавить фактическую статистику времени выполнения к выводу, необходимо выполнить оператор, используя ANALYZEопцию:

EXPLAIN ANALYZE
    SELECT
        f.film_id,
        title,
        name category_name
    FROM
        film f
        INNER JOIN film_category fc 
            ON fc.film_id = f.film_id
        INNER JOIN category c 
            ON c.category_id = fc.category_id
    ORDER BY
        title;

Вот что получилось:

Вывод PostgreSQL EXPLAIN ANALYZE

Вывод

В этом руководстве вы узнали, как использовать EXPLAINоператор PostgreSQL для отображения плана запроса для определенного оператора SQL.