The N+1 Query Problem in ORMs: How to Detect and Eliminate It in SQLAlchemy and Prisma
Learn to detect and eliminate the N+1 problem, the silent performance killer in ORM-based applications: why lazy loading multiplies your queries, SQLAlchemy 2.0 loading strategies (selectinload, joinedload, and raiseload as a guardrail), include and relationLoadStrategy in Prisma, the mistakes that quietly reintroduce it, and how to harden your code with query-counting tests. With production-ready code in Python and TypeScript. Extended edition: production detection with pg_stat_statements and APM, query budgets in CI, async SQLAlchemy and MissingGreenlet, per-relation limits with window functions and contains_eager, wide columns, aggregates, relationLoadStrategy and Prisma's internal dataloader, DataLoader in GraphQL, the serialization N+1, manual batching, bulk writes, exports with yield_per, connection retention, observability with OpenTelemetry, Django and Rails, two case studies, anti-patterns, glossary, and FAQ. New expansion: the inheritance N+1 with selectin_polymorphic, write-only collections (WriteOnlyMapped), why .unique() is required after joinedload, selectinload under the hood (batches of 500, expanded IN and PgBouncer), HTTP fan-out between microservices with semaphores and batch endpoints, and an August 2026 tooling radar. New expansion: filtered loading with contains_eager and with_loader_criteria, the full strategy catalogue (subqueryload, immediateload, noload), what the PostgreSQL planner does with your fix (nested loop, hash join and work_mem), the reverse cartesian-product anti-pattern, the real cost of N+1 across read replicas, a Prisma client extension that detects the pattern in real time, and keyset pagination with relationships.
Verificando acceso...