PostgreSQL LinuxWindowsmacOS

PostgreSQL: медленные запросы — EXPLAIN ANALYZE и индексы

  • Обновлено
  • Чтение ≈ 2 минуты

Краткий ответ

Используйте EXPLAIN (ANALYZE, BUFFERS), находите Seq Scan на больших таблицах и добавляйте подходящие индексы. Следите за VACUUM и статистикой.

В этой статье
  1. Что означает ошибка
  2. Причины и признаки
  3. Пошаговое решение
  4. Если проблема осталась

#Что означает ошибка

Сообщение
Медленные запросы

Используйте EXPLAIN (ANALYZE, BUFFERS), находите Seq Scan на больших таблицах и добавляйте подходящие индексы. Следите за VACUUM и статистикой.

#Причины и признаки

Возможная причинаКак узнатьЧто делать
Нет индексаВ плане фильтра по селективному столбцу нет индекса.Оцените подходящий индекс на тестовой базе.
Устаревшая статистикаРасхождение estimated/actual rows велико.Сверьте актуальность статистики и ANALYZE.
Раздутая таблицаБольшой размер таблицы не соответствует полезным данным.Изучите autovacuum и раздувание до обслуживания.
Тяжёлый запросЗапрос обрабатывает больше строк, чем нужно.Оптимизируйте SELECT и сравните план.

#Пошаговое решение

  1. Зафиксируйте медленный SQL и измерениеВ журнале приложения или через согласованный мониторинг найдите полный параметризованный SQL и типичное время выполнения. По возможности работайте на тестовой копии с похожим объёмом данных. Не запускайте массовые запросы с EXPLAIN ANALYZE на рабочей базе в часы пик: ANALYZE реально исполняет запрос.
  2. Прочитайте план безопасного SELECTВ psql для диагностического запроса только чтения выполните EXPLAIN (ANALYZE, BUFFERS) SELECT ...;, подставив разрешённый реальный SELECT. Сравните estimated rows/actual rows, количество чтений и узкие места; Seq Scan не всегда ошибка — на маленькой таблице или при выборе большинства строк он нормален.
  3. Выберите исправление по фактической причинеПри неактуальной статистике администратор оценивает ANALYZE имя_таблицы; при селективном условии проверяет подходящий индекс, оценивая стоимость его создания и последующих INSERT/UPDATE. Для работы без долгой блокировки в PostgreSQL есть CREATE INDEX CONCURRENTLY, но он имеет ограничения и требует отдельного согласованного запуска. Не создавайте индексы на каждый столбец.
  4. Сравните результат и нагрузкуПосле одной согласованной правки повторите тот же SELECT с теми же параметрами на тестовой базе, сравните время, фактические строки, BUFFERS и план. Если улучшения нет, рассмотрите структуру запроса, статистику и конфигурацию сервера; отмените неудачный эксперимент согласно заранее составленному плану.

#Если проблема осталась

Если «PostgreSQL: медленные запросы — EXPLAIN ANALYZE и индексы» повторяется, сохраните время, состояние подключения и точный текст ошибки. Не меняйте сразу несколько настроек — иначе станет трудно понять, какое действие повлияло на результат.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.