Выбор ответа Junior Django ORM и N+1 спрашивают часто обновлено
Что такое проблема N+1
Вопрос
Что такое проблема N+1 запросов?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Один запрос за списком и ещё по запросу на объект за связанными. Классический пример: цикл по заказам и обращение order.customer.name.
Варианты ответа
- Один запрос за списком и ещё по запросу на объект за связаннымиправильный ответ
- Запрос возвращает на одну строку больше, чем нужно странице пагинации
- База выполняет N+1 транзакций вместо одной при сохранении списка
- Ошибка пагинации: на странице оказывается N+1 элементов вместо N
Разбор
Классический пример: цикл по заказам и обращение order.customer.name. Первый запрос получает N заказов, а затем на каждый заказ выполняется запрос за клиентом. На 100 заказах это 101 запрос, и страница тормозит из-за сетевых задержек до БД. Лечится select_related или prefetch_related. С лишними строками, транзакциями и пагинацией проблема не связана.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Методы QuerySet и их назначение
Следующий вопрос
Задача Celery и незакоммиченная транзакция
Ещё по теме «Django ORM и N+1»
- Задвоение сумм при нескольких annotate
- Посчитать SQL-запросы при ленивой загрузке
- Как prefetch_related склеивает данные
- exists() и count() вместо загрузки строк
- Атомарное увеличение счётчика
- Prefetch с вложенным select_related
- transaction.atomic
- Когда выполняется QuerySet