typescript.n_plus_one_queries
Performance
High
Detects database queries inside loops.
Why It Matters
Section titled “Why It Matters”N+1 queries destroy performance:
- Linear scaling — 100 items = 101 queries
- Database strain — Many small queries vs few large ones
- Latency accumulation — Each query adds network round-trip
- Hidden in code — ORMs make it easy to trigger
Example
Section titled “Example”// ❌ Beforeconst users = await User.findAll();for (const user of users) { const orders = await Order.findAll({ where: { userId: user.id } }); console.log(user.name, orders.length);}100 users = 101 queries.
// ✅ Afterconst users = await User.findAll({ include: [{ model: Order }]});for (const user of users) { console.log(user.name, user.orders.length);}Now it’s 1-2 queries total.
What Unfault Detects
Section titled “What Unfault Detects”- Database calls inside loops
- Relationship access in iterations
- Missing eager loading
Auto-Fix
Section titled “Auto-Fix”Unfault adds eager loading or suggests query restructuring.
ORM Patterns
Section titled “ORM Patterns”// Prismaconst users = await prisma.user.findMany({ include: { orders: true }});
// Sequelizeconst users = await User.findAll({ include: [Order]});
// TypeORMconst users = await userRepository.find({ relations: ['orders']});
// Manual batchingconst userIds = users.map(u => u.id);const orders = await Order.findAll({ where: { userId: { [Op.in]: userIds } }});const ordersByUser = groupBy(orders, 'userId');