Tema SQL
pg_sleep() (PostgreSQL)
Pausa la sesión durante el número dado de segundos (double precision). Solo para pruebas, reproducción de condiciones de carrera o demos; análogo a SLEEP() en MySQL y WAITFOR DELAY en SQL Server.
Descripción
pg_sleep(segundos) bloquea el backend actual hasta completar la espera o hasta cancelación (pg_cancel_backend). pg_sleep_for(interval) y pg_sleep_until(timestamp) ofrecen variantes con tipos interval/timestamp. En producción evita bloquear conexiones del pool: usa colas con delay en aplicación. Dentro de transacciones mantiene locks si los hay. No es precisión en tiempo real: el SO puede despertar más tarde bajo carga. Equivalentes: MySQL SLEEP(), SQL Server WAITFOR DELAY. Para benchmarks de rendimiento usa EXPLAIN ANALYZE, no pg_sleep.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
pg_sleep(segundos)
pg_sleep_for(intervalo)
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- Solo diagnóstico
- No uses en vistas o rutas de usuario final.
- Cancelación
- El cliente puede enviar cancel query.
- MySQL
- SLEEP() misma idea; ambos inadecuados para lógica de negocio.
Ejemplos
Ejemplo 1
SELECT pg_sleep(2);
-- Pausa ~2 s
SELECT pg_sleep(0.1);
Ejemplo 2
SELECT clock_timestamp() AS t0;
SELECT pg_sleep(0.05);
SELECT clock_timestamp() AS t1;
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.