Выбор ответа Junior Производительность и профилирование спрашивают часто обновлено
N+1 в трейсе
Вопрос
В трейсе медленного запроса списка заказов видно 200 одинаковых коротких спанов SELECT * FROM items WHERE order_id = ? подряд. Что это?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Проблема N+1: на каждый заказ свой запрос, нужен JOIN или IN. Каждый запрос быстрый, но 200 последовательных походов в базу суммируют сетевые задержки.
Варианты ответа
- Проблема N+1: на каждый заказ свой запрос, нужен JOIN или INправильный ответ
- Нормальная работа ORM, которая так прогревает кеш запросов
- Атака на базу данных перебором идентификаторов заказов
- Сбой трейсинга, который дублирует один и тот же спан
Разбор
Каждый запрос быстрый, но 200 последовательных походов в базу суммируют сетевые задержки. Решение: загрузка пачкой (WHERE order_id IN (...)), JOIN или механизм предзагрузки ORM. Трейсы делают такие проблемы очевидными, а метрики базы показывают только «много быстрых запросов».
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.