N+1 is the most common performance problem with ORMs. Instead of 1 query you send 101 queries — and the database suffers.
The Problem¶
N+1 Problem — Detection and Solutions¶
users = User.query.all() # 1 query for user in users: print(user.orders) # N queries (1 per user!)
Solution — Eager Loading¶
SQLAlchemy — joinedload¶
users = session.query(User).options(joinedload(User.orders)).all()
Django — select_related / prefetch_related¶
users = User.objects.prefetch_related(‘orders’).all()
Prisma — include¶
const users = await prisma.user.findMany({ include: { orders: true } });
Detection¶
Django — django-debug-toolbar¶
SQLAlchemy — echo=True or sqlalchemy.engine logging¶
nplusone library (Python)¶
pip install nplusone
Key Takeaway¶
Eager loading (joinedload, prefetch_related, include). Detection: debug toolbar, query logging.