Procedimientos Almacenados y CALL
Lógica de múltiples pasos dentro de la base de datos. Guía de PostgreSQL orientada a producción.
Receta
CREATE OR REPLACE PROCEDURE app.transfer_credit(p_from bigint, p_to bigint, p_amount numeric)
LANGUAGE plpgsql AS $$
BEGIN
UPDATE app.wallets SET balance = balance - p_amount WHERE account_id = p_from;
UPDATE app.wallets SET balance = balance + p_amount WHERE account_id = p_to;
END;
$$;Cuándo usar esto: Implementa o revisa SQL usando este concepto en PostgreSQL 18.
Ejemplo de Trabajo
CALL app.transfer_credit(1, 2, 10.00);Lo que esto demuestra:
- SQL idiomático de PostgreSQL 18
- Patrones adecuados para revisión con EXPLAIN
- Valores predeterminados seguros para cargas de trabajo OLTP
Análisis Profundo
Mecanismo
- El analizador (parser) construye el árbol de consulta.
- El ejecutor (executor) ejecuta los nodos del plan.
- MVCC proporciona aislamiento de instantánea por sentencia o transacción.
Práctica
- Mantén los ejemplos legibles.
- Prueba con recuentos de filas realistas.
Errores Comunes
- Transacciones largas: Bloquean el vacuum y aumentan la hinchazón (bloat). Solución: Confirma rápidamente; establece tiempos de espera (timeouts).
- Índices faltantes: Escaneos secuenciales (seq scans) bajo carga. Solución: Indexa las columnas de unión (join) y filtro.
- Bloqueos implícitos: Bloqueos inesperados. Solución: Usa
FOR UPDATEexplícito cuando sea necesario. - Suposición incorrecta de aislamiento: Anomalías bajo escrituras concurrentes. Solución: Elige el nivel deliberadamente.
- Migraciones sin probar: Bloqueo DDL u objetos inválidos. Solución: Prepara las migraciones con datos similares a producción.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Lógica a nivel de aplicación | CRUD simple | Integridad repartida entre servicios |
| Vista materializada | Lecturas repetidas intensivas | Complejidad de actualización (refresh) |
| Procesador de streams externo | Eventos entre sistemas | Superficie operativa adicional |
Preguntas Frecuentes
¿Esto aplica a las réplicas?
Las réplicas de solo lectura ejecutan SELECT; las escrituras van al primario.
¿Qué hay de PgBouncer?
El pooling de transacciones afecta las características a nivel de sesión; usa el modo de sesión cuando sea necesario.
Relacionado
- Conceptos Básicos de Funciones - SQL vs PL/pgSQL
Versiones de la Pila: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, y PostGIS 3.5+.