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

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

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

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

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

SQL Manager

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

explain SQL visually

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

2015-07-07_110432

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

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

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

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

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

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

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

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

Подзапросы

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

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

 

Поделиться: Share on LinkedIn
Linkedin
Share on VK
VK
Share on Facebook
Facebook
0Tweet about this on Twitter
Twitter

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

Ваш e-mail не будет опубликован.

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

Яндекс.Метрика