Вступить в клуб →
лёгкаявопросPostgreSQL, ORM и кэш Redis

N+1 запрос в ORM при выводе списка заказов

Ручка списка заказов написана так:

const orders = await prisma.order.findMany({ take: 100 });

for (const order of orders) {
  order.customer = await prisma.customer.findUnique({ where: { id: order.customerId } });
}

В логах базы на один вызов ручки видно 101 запрос. Как это называется и что делать?

  • Это нормальная работа ORM: связанные сущности всегда загружаются отдельными запросами, повлиять на их количество из кода нельзя
  • Это N+1: нужно загрузить связанные записи вместе со списком — через include/join или одним запросом по списку идентификаторов
  • Это следствие отсутствия транзакции: если обернуть цикл в транзакцию, база выполнит запросы за один проход
  • Это проблема пула соединений: увеличение размера пула уберёт лишние запросы

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела