Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: orm, lazy, loading

Что такое проблема N+1 запросов и почему она возникает в ORM

Этот вопрос проверяет понимание типичной ORM-проблемы, которая приводит к резкому росту количества запросов к базе данных.

Короткий ответ

Проблема N+1 возникает, когда сначала выполняется один запрос для получения списка объектов, а затем по одному запросу для каждого объекта из этого списка. В итоге вместо 2 запросов выполняется N+1, где N — количество записей. Это часто происходит из-за ленивой загрузки связей в ORM. Такая схема резко увеличивает нагрузку на БД и замедляет приложение.

Длинный ответ

N+1 — одна из самых частых причин неожиданной деградации производительности при использовании ORM.

Определение

N+1 problem — ситуация, когда получение связанных данных приводит к выполнению одного основного запроса и дополнительных запросов для каждого элемента результата.

1) Как возникает N+1

Рассмотрим пример:

  • Есть User и Order.

  • У пользователя может быть много заказов.

  • Связь User.orders загружается лениво.

users = session.execute(select(User)).scalars().all()

for user in users:
    print(len(user.orders))  # отдельный запрос для каждого user

Что происходит:

  1. 1 запрос для списка пользователей.

  2. N запросов для заказов каждого пользователя.

2) Почему ORM так делает

ORM по умолчанию:

  • не знает, нужны ли тебе связанные данные;

  • откладывает загрузку до момента обращения.

Это удобно для простых сценариев, но опасно в циклах.

3) Чем это опасно

Основные проблемы:

  • резкий рост количества запросов;

  • нагрузка на соединения БД;

  • рост времени ответа;

  • плохая масштабируемость.

4) Как заметить проблему

Типичные признаки:

  • много одинаковых запросов в логах;

  • небольшие запросы, выполняемые сотни раз;

  • высокая нагрузка на БД при небольшом объеме данных.

Вывод

N+1 — это не баг ORM, а следствие ленивой загрузки связей. Если не контролировать загрузку данных, приложение может начать выполнять сотни лишних запросов.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    5

Навыки

  • Python

    Python

Ключевые слова

#orm

#lazy

#loading

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.