Sentencia preparada
Patrón SQL: se envía una plantilla de consulta con marcadores ($1, ?) y los parámetros se vinculan por separado. Dos ventajas principales: protección contra la inyección SQL (los parámetros nunca se interpretan como SQL) y caché del plan de ejecución.
Ciclo de vida: PREPARE (se envía la plantilla, corren el parser y el planificador) → EXECUTE (se envían los valores, se ejecuta el plan). Caché del plan: las llamadas siguientes se saltan el análisis y la planificación y van directas a ejecutar. Contrapartida: el planificador genera un plan genérico, que puede ser subóptimo para valores concretos. PostgreSQL, tras 5 llamadas con plan genérico, comprueba si un plan a medida sería mejor. Problema con el pooling de conexiones: las sentencias preparadas son por sesión — si las conexiones del pool se comparten globalmente, las sentencias se repreparan a menudo. El modo transacción de PgBouncer rompe las sentencias preparadas.