На какие проблемы в плане выполнения запроса указывает EXPLAIN ANALYZE?

Ответ

EXPLAIN ANALYZE в PostgreSQL (и аналогичных СУБД) выполняет запрос и показывает реальный план выполнения с фактическим временем и количеством строк. Это мощный инструмент для поиска узких мест.

Основные "красные флаги", на которые стоит обратить внимание:


  1. Seq Scan (Последовательное сканирование) на больших таблицах. Главный признак отсутствия подходящего индекса для условия WHERE или JOIN. План с Index Scan почти всегда предпочтительнее.



  2. Большая разница между rows (оценка) и actual rows (факт). Если планировщик сильно ошибается в оценке количества строк (например, ожидает 10, а получает 1 000 000), он может выбрать неоптимальный способ соединения таблиц (JOIN). Обычно это говорит об устаревшей статистике. Решение: ANALYZE your_table;.



  3. Filter с большим количеством отброшенных строк. Если после сканирования по индексу (Index Scan) узел Filter отбрасывает большинство строк, значит, индекс не очень селективен (неэффективен) для данного запроса.



  4. Сортировки на диске (Sort Method: external merge Disk). Если для сортировки (ORDER BY) или некоторых видов JOIN не хватает памяти (work_mem), PostgreSQL сбрасывает временные данные на диск. Это крайне медленная операция, которую следует избегать, увеличивая work_mem или оптимизируя запрос.



  5. Высокое значение Planning time. Если планирование запроса занимает значительное время, это может указывать на его избыточную сложность, большое количество таблиц в JOIN или проблемы со статистикой.



  6. Nested Loop (Вложенные циклы) с большим количеством итераций. Этот метод соединения эффективен для малого количества строк во внешней таблице, но может стать катастрофически медленным, если планировщик ошибся с оценкой и итераций оказались миллионы.


Анализ EXPLAIN ANALYZE — это поиск самых "дорогих" (cost) и долгих (actual total time) узлов в плане и понимание, почему они стали узким местом.