Skip to content

typescript.n_plus_one_queries

Performance High

Detects database queries inside loops.

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
// ❌ Before
const 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.

// ✅ After
const 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.

  • Database calls inside loops
  • Relationship access in iterations
  • Missing eager loading

Unfault adds eager loading or suggests query restructuring.

// Prisma
const users = await prisma.user.findMany({
include: { orders: true }
});
// Sequelize
const users = await User.findAll({
include: [Order]
});
// TypeORM
const users = await userRepository.find({
relations: ['orders']
});
// Manual batching
const userIds = users.map(u => u.id);
const orders = await Order.findAll({
where: { userId: { [Op.in]: userIds } }
});
const ordersByUser = groupBy(orders, 'userId');