#Что означает ошибка
Медленные запросы
Используйте EXPLAIN (ANALYZE, BUFFERS), находите Seq Scan на больших таблицах и добавляйте подходящие индексы. Следите за VACUUM и статистикой.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Нет индекса | В плане фильтра по селективному столбцу нет индекса. | Оцените подходящий индекс на тестовой базе. |
| Устаревшая статистика | Расхождение estimated/actual rows велико. | Сверьте актуальность статистики и ANALYZE. |
| Раздутая таблица | Большой размер таблицы не соответствует полезным данным. | Изучите autovacuum и раздувание до обслуживания. |
| Тяжёлый запрос | Запрос обрабатывает больше строк, чем нужно. | Оптимизируйте SELECT и сравните план. |
#Пошаговое решение
- Зафиксируйте медленный SQL и измерениеВ журнале приложения или через согласованный мониторинг найдите полный параметризованный SQL и типичное время выполнения. По возможности работайте на тестовой копии с похожим объёмом данных. Не запускайте массовые запросы с
EXPLAIN ANALYZEна рабочей базе в часы пик: ANALYZE реально исполняет запрос. - Прочитайте план безопасного SELECTВ psql для диагностического запроса только чтения выполните
EXPLAIN (ANALYZE, BUFFERS) SELECT ...;, подставив разрешённый реальный SELECT. Сравните estimated rows/actual rows, количество чтений и узкие места; Seq Scan не всегда ошибка — на маленькой таблице или при выборе большинства строк он нормален. - Выберите исправление по фактической причинеПри неактуальной статистике администратор оценивает
ANALYZE имя_таблицы; при селективном условии проверяет подходящий индекс, оценивая стоимость его создания и последующих INSERT/UPDATE. Для работы без долгой блокировки в PostgreSQL естьCREATE INDEX CONCURRENTLY, но он имеет ограничения и требует отдельного согласованного запуска. Не создавайте индексы на каждый столбец. - Сравните результат и нагрузкуПосле одной согласованной правки повторите тот же SELECT с теми же параметрами на тестовой базе, сравните время, фактические строки, BUFFERS и план. Если улучшения нет, рассмотрите структуру запроса, статистику и конфигурацию сервера; отмените неудачный эксперимент согласно заранее составленному плану.
#Если проблема осталась
Если «PostgreSQL: медленные запросы — EXPLAIN ANALYZE и индексы» повторяется, сохраните время, состояние подключения и точный текст ошибки. Не меняйте сразу несколько настроек — иначе станет трудно понять, какое действие повлияло на результат.