N+1 queries y cuellos de botella en base de datos
La aplicacion ejecuta demasiadas consultas por solicitud o usa el acceso a datos de forma ineficiente, generando saturacion de base de datos.
📈 Que cambia para el negocio
Reduce round-trips, costo por request y desgaste innecesario sobre la base de datos.
💼 Que demuestra tecnicamente
Muestra criterio de acceso a datos mas alla del lenguaje: el problema no es el ORM en abstracto, sino el patron de carga dentro de bucles.
✅ Evidencia que deja
- Contrasta /orders-legacy y /orders-optimized sobre la misma base relacional y los mismos datos semilla.
- Mide cuantas queries y cuanto tiempo de DB consume cada request.
- Entrega diagnostics/summary con densidad relacional para explicar por que el problema escala mal.
👀 Que mirar al ejecutarlo
- Cuantas consultas hace la ruta legacy frente a la optimized para el mismo limit y rango de dias.
- Como cae db_time_ms_in_request cuando la lectura se consolida.
- Si diagnostics/summary deja claro por que la cardinalidad de items empeora el patron N+1.
Como esta resuelto en cada stack
Los 5 stacks ejecutan N+1 real sobre SQL embebido. PHP + PostgreSQL via PDO; Python con SQLite stdlib (sqlite3) y cursor compartido; Node.js 22 con SQLite via node:sqlite built-in + prepared statements + event_loop_lag_ms; Java 21 con SQLite via sqlite-jdbc + PreparedStatement + batch IN(?, ...); .NET 8 con SQLite via Microsoft.Data.Sqlite + SqliteCommand + batch IN(@id0, ...)
| Stack | Health check local | Compose | Detalle |
|---|---|---|---|
| 🐘 PHP 8.3 | http://localhost:8100/02/health | compose.root.yml | README del stack |
| 🐍 Python 3.12 | http://localhost:8200/02/health | compose.python.yml | README del stack |
| 🟢 Node.js 22 | http://localhost:8300/02/health | compose.nodejs.yml | README del stack |
| ☕ Java 21 | http://localhost:8400/02/health | compose.java.yml | README del stack |
| 🔵 .NET 8 | http://localhost:8500/02/health | compose.dotnet.yml | README del stack |
| 🐹 Go 1.23 | http://localhost:8600/02/health | compose.go.yml | README del stack |
| 🦀 Rust 1.83 | http://localhost:8700/02/health | compose.rust.yml | README del stack |
El expediente completo
El caso no empieza en el codigo: empieza en el sintoma y termina en el postmortem.