Общая информация про планы запросов
План запроса нужен для того, чтобы понять, что является самым слабым звеном (какой узел) в дереве запроса (из-за которого, например, запрос выполнялся очень долго или неравномерно распределяются ресурсы). В языке SQL есть две команды, которые вызывают план запроса:
EXPLAIN <query_text> - строит план самого запроса. Результат этой команды не меняется в зависимости от количества ее запусков. Он зависит только от статистики распределения данных в вашей БД. Показывает лишь планируемые значения, без выполнения запроса.
EXPLAIN ANALYSE <query_text> - непосредственно выполняет запрос и анализирует его. Показывает планируемые значения и фактические значения выполненного запроса. Если фактический и планируемый результаты запроса сильно не совпадают, значит, статистика неактуальная и нужно настроить analyse или vacuum analyse.
Информацию об определённом параметре в результате explain analyse можно скрыть, написав в запросе SQL <some_parameter> = OFF.
В общих словах, результат выполнения такой команды возвращает названия узлов (подчёркнуты зелёным цветом на рисунке ниже) написанного запроса и «стоимость» каждого такого запроса (cost, обозначена цифрой 1 на рисунке ниже). Соответственно, план, в котором эта стоимость меньше, выигрывает. Стоимость возвращается в зависимости от заданных параметров, которыми могут быть: стоимость одной атомарной операции с точки зрения CPU, стоимость извлечения одной записи и др. Также возвращаются следующие показатели (все они предоставляются по каждому узлу):
время выполнения запроса (actual time - цифра 4 на рисунке ниже);
количество циклов прохождения по какому-то узлу (loops - цифра 5 на рисунке ниже);
длина извлечённых запросом данных - количество строк («rows» - цифра 2 на рисунке ниже);
ширина извлечённых запросом данных - размер этих строк в байтах («width» - цифра 3 на рисунке ниже).
Рис.1 Пример плана запроса SQL
Можно настроить Postgres, чтобы он не выбирал пути выполнения запросов через определённые узлы (SET <имя узла, например, Index Scan> = OFF).
Чтобы посмотреть, какие сейчас настройки у нас используются, нужно написать «explain settings» на языке SQL.
В зависимости от того, какие синтаксис и содержание у нашего запроса, мы будем получать разные названия узлов и ключевые слова (Result, Values Result, Function Scan, Filter, Sec Scan, Index Scan, Custom Scan, Bitmap Heap Scan и др.)