N+1 ist das häufigste Performance-Problem bei ORMs. Statt 1 Abfrage senden Sie 101 Abfragen — und die Datenbank leidet.
Das Problem¶
N+1 — 1 + N Abfragen¶
users = User.query.all() # 1 Abfrage for user in users: print(user.orders) # N Abfragen (1 pro User!)
Lösung — 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 } });
Erkennung¶
Django — django-debug-toolbar¶
SQLAlchemy — echo=True oder sqlalchemy.engine Logging¶
nplusone Library (Python)¶
pip install nplusone
Wichtigste Erkenntnis¶
Eager Loading (joinedload, prefetch_related, include). Erkennung: Debug-Toolbar, Query-Logging.