EXPLAIN — основной инструмент для отладки производительности запросов в PostgreSQL. За сухими цифрами и техническими терминами в его выводе скрываются истории о том, как база данных пытается максимально быстро найти нужные данные.
Планировщик PostgreSQL выбирает путь выполнения запроса на основе статистики и эвристик. Sequential Scan — самый простой способ, перебор всех строк таблицы. Index Scan использует индекс и подходит для точечных запросов. Bitmap Scan комбинирует несколько индексов, собирая битовую карту подходящих строк.
Parallel Sequential Scan означает, что база распределила нагрузку между несколькими процессами. Звучит круто, но если запрос часто выполняется — лучше помочь базе правильным индексом. Nested Loop, Hash Join и Merge Join — разные стратегии объединения таблиц, каждая со своими сильными сторонами.
EXPLAIN ANALYZE не просто показывает план, но и реально выполняет запрос. В выводе появляются actual time и actual rows — реальное время выполнения и количество обработанных строк. Если цифры сильно отличаются от estimated — планировщик работает с устаревшей статистикой.
Высокие значения в startup time говорят о длительной подготовке операции. Большая разница между loops planned и loops actual намекает на проблемы с кардинальностью. А buffers shared hit против buffers shared read показывает, насколько эффективно работает кэш.
Partial и parallel стоит внимательно изучить. Partial Mode означает, что база выбрала только часть данных. А чем больше workers запущено в parallel, тем важнее следить за нагрузкой на CPU и диск — параллельное выполнение требует ресурсов.
Бывает, что индекс есть, а база его игнорирует. Причин масса: от слишком большого процента подходящих строк до неудачной формулировки WHERE. Особенно коварны неявные преобразования типов и функции в условиях — они мешают использовать индексы.
И последнее: EXPLAIN ANALYZE реально выполняет запрос. На больших таблицах это может занять много времени. Если нужно только проверить план — используйте обычный EXPLAIN. А для анализа боевых систем присмотритесь к auto_explain, он покажет планы запросов прямо в логах.
🏴☠️ @happy_devops
Post #679
661

- 👍 5