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;
Вывод следующий:
В следующем примере показан план запроса, который возвращает фильм по определенному film_id
.
EXPLAIN SELECT * FROM film WHERE film_id = 100;
Вот что получилось:
Поскольку film_id
индексируется, оператор вернул другой план. В выходных данных планировщик использовал сканирование индекса вместо последовательного сканирования таблицы film
.
Чтобы снизить стоимость, можно воспользоваться COSTS
опцией:
EXPLAIN (COSTS FALSE) SELECT
*
FROM
film
WHERE
film_id = 100;
Язык кода: PHP ( php )
В следующем примере показан план запроса, использующего агрегатную функцию:
EXPLAIN SELECT COUNT(*) FROM film;
Вывод:
Следующий пример возвращает план для оператора, объединяющего несколько таблиц:
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;
Вывод:
Чтобы добавить фактическую статистику времени выполнения к выводу, необходимо выполнить оператор, используя 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;
Вот что получилось:
Вывод
В этом руководстве вы узнали, как использовать EXPLAIN
оператор PostgreSQL для отображения плана запроса для определенного оператора SQL.