Know-How
N+1 Problem — detekce a řešení
N+1 je nejčastější performance problém s ORM. Místo 1 dotazu pošlete 101 dotazů — a databáze trpí.
Problém
# ❌ N+1 — 1 + N dotazů
users = User.query.all() # 1 dotaz
for user in users:
print(user.orders) # N dotazů (1 per user!)
Řešení — 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 }
});
Detekce
# Django — django-debug-toolbar
# SQLAlchemy — echo=True nebo sqlalchemy.engine logging
# nplusone library (Python)
pip install nplusone
Klíčový takeaway
Eager loading (joinedload, prefetch_related, include). Detekce: debug toolbar, query logging.