Głębiej
N+1 to klasyczny problem ORM/wydajności: 1) zapytanie #1 ładuje listę encji nadrzędnych 2) dla każdej encji ORM lazily ładuje relację → N dodatkowych zapytań
W kodzie często wygląda „niewinnie”, ale w logach SQL/APM widać powtarzalny wzorzec.
Jak unikać
- **Eager fetch / join fetch** dla znanych relacji (jedno zapytanie, ale uważaj na mnożenie wierszy).
- **Batching**: pobierz dzieci dla wielu rodziców jednym zapytaniem przez `IN (...)`.
- **DataLoader pattern** (częste w GraphQL): batch + cache per request.
- **Precompute**: denormalizacja albo materialized views dla read-heavy endpointów.
Praktyka
- Włącz logowanie zapytań w dev i obserwuj powtórzenia.
- Mierz: małe N+1 czasem jest OK; duże N+1 zabija latency.
Typowe pułapki
- Naprawa N+1 „mega joinem”, który mnoży wiersze i podnosi zużycie pamięci/transfer.
- Pobieranie relacji, których nie potrzebujesz.
- Założenie, że indeksy rozwiążą N+1 (pomogą pojedynczym zapytaniom, ale nadal płacisz N round-tripów).