Cómo matar una consulta
Antes de matar una consulta, necesitas identificar cuáles están causando problemas. Usa el siguiente SQL para listar todas las consultas en ejecución junto con su duración:
SELECT
pid,
user_name,
starttime,
query,
elapsed
FROM
stv_recents
WHERE
state = 'Running'
ORDER BY
elapsed DESC;
Resultado esperado:
| pid | user_name | starttime | query | elapsed |
|---|---|---|---|---|
| 123 | admin | 2023-10-01 10:00:00 | SELECT * FROM ? | 01:20:15 |
| 456 | analyst | 2023-10-01 10:45:00 | UPDATE table ? | 00:35:10 |
| … | … | … | … | … |
La columna elapsed muestra cuánto tiempo lleva ejecutándose la consulta.
Una vez que identifiques la consulta problemática (usando el pid de la lista anterior), puedes terminarla. Usa el siguiente comando:
CANCEL pid;
Ejemplo:
CANCEL 123;
Cómo verificar que la consulta se terminó
Para asegurarte de que la consulta se terminó, vuelve a ejecutar la consulta inicial:
SELECT
pid,
user_name,
starttime,
query,
elapsed
FROM
stv_recents
WHERE
state = 'Running'
ORDER BY
elapsed DESC;
La consulta terminada ya no debería aparecer en los resultados.
Cómo manejar consultas bloqueadas
A veces, las consultas se bloquean y hay que matarlas para liberar recursos. Puedes identificar las consultas bloqueadas con la tabla STV_BLOCKED.
SELECT
b.pid,
b.user_name,
b.db,
b.query,
l.pid AS blocked_by_pid,
l.user_name AS blocked_by_user
FROM
stv_blocked b
JOIN
stv_locks l
ON
b.lock_owner_pid = l.pid;
Resultado esperado:
| pid | user_name | db | query | blocked_by_pid | blocked_by_user |
|---|---|---|---|---|---|
| 5678 | analytics | reporting | SELECT count(*) FROM ?; | 9101 | Admin |
Para matar una consulta bloqueada, usa el comando CANCEL como se mostró antes:
CANCEL 5678;
Cómo automatizar la terminación de consultas
En bases de datos con requisitos de rendimiento estrictos, automatizar la detección y terminación de consultas de larga duración puede ser muy útil. A continuación tienes un ejemplo de procedimiento para terminar consultas que se ejecutan por más tiempo que un umbral específico:
DO $$
DECLARE
long_running_query RECORD;
BEGIN
FOR long_running_query IN
SELECT pid
FROM stv_recents
WHERE state = 'Running'
AND elapsed > interval '00:30:00' -- Replace with desired threshold
LOOP
EXECUTE 'CANCEL ' || long_running_query.pid;
END LOOP;
END;
$$;
Consideraciones importantes
- Permisos: Solo los usuarios con los permisos adecuados pueden cancelar consultas.
- Impacto: Terminar una consulta puede afectar el rendimiento de la aplicación o causar inconsistencias en los datos si no se hace correctamente.
- Monitoreo: Monitorear con regularidad el rendimiento de las consultas ayuda a detectar problemas a tiempo.
Conclusión
Gestionar bien las consultas de larga duración te ayuda a garantizar un rendimiento óptimo de tu clúster de Amazon Redshift. Siguiendo estos pasos, puedes identificar y terminar rápidamente cualquier consulta problemática. Implementar soluciones automatizadas para el monitoreo regular y la terminación de consultas te puede ayudar aún más a mantener el rendimiento.
Asegúrate de probar todos los comandos y scripts en un entorno que no sea de producción antes de desplegarlos en producción, para evitar interrupciones no deseadas.
Otras publicaciones que te pueden gustar:
Beekeeper Studio es un cliente de bases de datos gratuito y de código abierto
La mejor herramienta de consultas y edición de SQL que he usado. Tiene todo lo que necesito para administrar mi base de datos. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio es rápido, intuitivo y fácil de usar. Es compatible con muchísimas bases de datos y funciona de maravilla en Windows, Mac y Linux.
Lo que dicen los usuarios de Beekeeper Studio
"Beekeeper Studio reemplazó por completo mi antiguo flujo de trabajo con SQL. Es rápido, intuitivo y hace que trabajar con bases de datos vuelva a ser agradable."
"He probado muchas GUI de bases de datos, pero Beekeeper logra el equilibrio perfecto entre funciones y simplicidad. Simplemente funciona."