Ответ вслух Middle EXPLAIN и оптимизация спрашивают часто обновлено

Запрос тормозит на проде

Вопрос

Пользователи жалуются, что страница заказов стала открываться 5 секунд. Ты подозреваешь базу. Твои действия по шагам.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Сначала убеждаюсь, что виновата база: смотрю метрики приложения и время запросов, pgstatstatements и лог медленных запросов, нахожу конкретный запрос. Заодно проверяю pgstatactivity: если запрос висит в ожидании блокировки, дело не в плане.

Что должно прозвучать в ответе

  • Подтвердить, что дело в базе: метрики, логи медленных запросов, pg_stat_statements

  • Получить точный запрос с параметрами и выполнить EXPLAIN (ANALYZE, BUFFERS) на копии или осторожно на проде

  • Читать план: где основное время, оценка строк против факта, тип сканов и соединений, сортировки на диске

  • Гипотезы: нет индекса, функция над колонкой, устаревшая статистика, большой OFFSET, N+1 в коде

  • Исправление и проверка эффекта (план и время после), индекс через CONCURRENTLY

  • Что поменялось: релиз, рост данных, блокировки, раздувание таблиц

Что могут спросить следом

  • Что делать, если на копии запрос быстрый, а на проде медленный?
  • Как понять, что запрос ждёт блокировку, а не работает?

Разбор

Сначала убеждаюсь, что виновата база: смотрю метрики приложения и время запросов, pg_stat_statements и лог медленных запросов, нахожу конкретный запрос. Заодно проверяю pg_stat_activity: если запрос висит в ожидании блокировки, дело не в плане. Потом беру запрос с реальными параметрами и смотрю EXPLAIN (ANALYZE, BUFFERS), на проде осторожно и только для чтения. В плане ищу узел, где уходит основное время, сравниваю оценку строк с фактом, смотрю на Seq Scan по большой таблице, Nested Loop на сотнях тысяч строк, сортировку на диске. Типичные причины: не хватает индекса под новый фильтр, функция над колонкой, устаревшая статистика после большой загрузки, большой OFFSET, или вообще N+1 в коде. Чиню, индекс создаю через CONCURRENTLY, и сравниваю план и время до и после. И выясняю, что изменилось: релиз, рост таблицы, раздувание после массовых обновлений.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме