Анализ запросов в PostgreSQL. Часть 1. Работа с анализатором запросов.

С помощью анализатора запросов SQL мы можем посмотреть, как именно наш запрос обрабатывается СУБД. К сожалению, знания разработчиков часто ограничены, чтобы полноценно использовать полученные данные. Попробуем разобраться, что к чему.

Выполнить запрос с его анализом можно с помощью EXPLAIN. Вот пример запроса и результат его выполнения:

EXPLAIN SELECT * FROM foo WHERE i = 4;

                         QUERY PLAN
--------------------------------------------------------------
 Index Scan using fi on foo  (cost=0.00..5.98 rows=1 width=4)
   Index Cond: (i = 4)
(2 rows)

Как видим, план выпонения запроса включает только одну условную операцию, сканирование индекса.

Не каждый разберётся даже в таком тексте с первого взгляда, хотя обычно такие тексты занимают несколько десятков, а то и сотен строк. Тут на помощь приходят визуализаторы, например, встроенный GUI анализатора для SQL Manager for PostgreSQL (EMS). Вот в каком виде она выдает результат:

SQL Manager

Есть сайт explain.depesz.com/, куда можно скопипастить результат EXPLAIN, и получить такую картинку:

explain SQL visually

Также на сайте можно посмотреть статистику по использованию различных операций в запросе и по обращениям к различным таблицам, из чего сразу можно понять, когда с запросом что-то не так:

2015-07-07_110432

Вернёмся к нашему изначальному запросу.

EXPLAIN SELECT * FROM foo WHERE i = 4;

                         QUERY PLAN
--------------------------------------------------------------
 Index Scan using fi on foo  (cost=0.00..5.98 rows=1 width=4)
   Index Cond: (i = 4)
(2 rows)

cost показывает относительные затраты на выполнение операции. Важно, что это не секунды, а просто некая величина, которая поможет оценить затраты на операцию относительно других операций в запросе;

rows — количество возвращаемых в ходе операции строк;

width — средний размер одной строки в байтах.

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

Чтобы получить план выполнения запроса на реальных данных, нужно выполнить его с параметром ANALYZE (Внимание! Если это не SELECT-запрос, то вы можете испортить свои данные, используйте ROLLBACK):

EXPLAIN ANALYZE SELECT * FROM foo WHERE i = 4;

При этом в дополнение к старым выводятся новые данные:

actual time — реальное время в миллисекундах, затраченное для получения первой строки и всех строк соответственно;
rows — реальное количество строк, полученных при выполнении операции;
loops — сколько раз операция выполнялась;
total runtime — общее время выполнения запроса.

Подзапросы

В выводе анализатора запросов могут присутствовать такие ключевые слова как SubPlan, Subquery Scan и InitPlan. Они обозначают подзапросы. SubPlan означает подзапрос, в котором есть ссылки на основной запрос, а InitPlan — подзапрос, у которого нет таких ссылок. Subquery Scan — примерно то же самое, но применяется к подзапросам, входящим в UNION. Все эти операции являются сугубо техническими, на них при анализе запроса можно особо не обращать внимания.

В следующих частях будут освещены основные операции доступа при выполнении запроса и операции объединения, сортировки, группировки и т.д.

 

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.