Ответ
EXPLAIN ANALYZE
в PostgreSQL (и аналогичных СУБД) выполняет запрос и показывает реальный план выполнения с фактическим временем и количеством строк. Это мощный инструмент для поиска узких мест.
Основные "красные флаги", на которые стоит обратить внимание:
Seq Scan
(Последовательное сканирование) на больших таблицах. Главный признак отсутствия подходящего индекса для условияWHERE
илиJOIN
. План сIndex Scan
почти всегда предпочтительнее.Большая разница между
rows
(оценка) иactual rows
(факт). Если планировщик сильно ошибается в оценке количества строк (например, ожидает 10, а получает 1 000 000), он может выбрать неоптимальный способ соединения таблиц (JOIN
). Обычно это говорит об устаревшей статистике. Решение:ANALYZE your_table;
.Filter
с большим количеством отброшенных строк. Если после сканирования по индексу (Index Scan
) узелFilter
отбрасывает большинство строк, значит, индекс не очень селективен (неэффективен) для данного запроса.Сортировки на диске (
Sort Method: external merge Disk
). Если для сортировки (ORDER BY
) или некоторых видовJOIN
не хватает памяти (work_mem
), PostgreSQL сбрасывает временные данные на диск. Это крайне медленная операция, которую следует избегать, увеличиваяwork_mem
или оптимизируя запрос.Высокое значение
Planning time
. Если планирование запроса занимает значительное время, это может указывать на его избыточную сложность, большое количество таблиц вJOIN
или проблемы со статистикой.Nested Loop
(Вложенные циклы) с большим количеством итераций. Этот метод соединения эффективен для малого количества строк во внешней таблице, но может стать катастрофически медленным, если планировщик ошибся с оценкой и итераций оказались миллионы.
Анализ EXPLAIN ANALYZE
— это поиск самых "дорогих" (cost
) и долгих (actual total time
) узлов в плане и понимание, почему они стали узким местом.