Выбор ответа Junior Производительность и профилирование спрашивают часто обновлено

N+1 в трейсе

Вопрос

В трейсе медленного запроса списка заказов видно 200 одинаковых коротких спанов SELECT * FROM items WHERE order_id = ? подряд. Что это?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Проблема N+1: на каждый заказ свой запрос, нужен JOIN или IN. Каждый запрос быстрый, но 200 последовательных походов в базу суммируют сетевые задержки.

Варианты ответа

  1. Проблема N+1: на каждый заказ свой запрос, нужен JOIN или INправильный ответ
  2. Нормальная работа ORM, которая так прогревает кеш запросов
  3. Атака на базу данных перебором идентификаторов заказов
  4. Сбой трейсинга, который дублирует один и тот же спан

Разбор

Каждый запрос быстрый, но 200 последовательных походов в базу суммируют сетевые задержки. Решение: загрузка пачкой (WHERE order_id IN (...)), JOIN или механизм предзагрузки ORM. Трейсы делают такие проблемы очевидными, а метрики базы показывают только «много быстрых запросов».

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

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