Ответ
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) узлов в плане и понимание, почему они стали узким местом.