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 или одним запросом по списку идентификаторов
- Это следствие отсутствия транзакции: если обернуть цикл в транзакцию, база выполнит запросы за один проход
- Это проблема пула соединений: увеличение размера пула уберёт лишние запросы
