Tuer une requête
Avant de pouvoir tuer une requête, tu dois identifier celles qui posent problème. Utilise le SQL suivant pour lister toutes les requêtes en cours avec leur durée :
SELECT
pid,
user_name,
starttime,
query,
elapsed
FROM
stv_recents
WHERE
state = 'Running'
ORDER BY
elapsed DESC;
Résultat attendu :
| 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 colonne elapsed indique depuis combien de temps la requête s’exécute.
Une fois la requête problématique identifiée (grâce au pid de la liste ci-dessus), tu peux l’arrêter. Utilise la commande suivante :
CANCEL pid;
Exemple :
CANCEL 123;
Vérifier l’arrêt de la requête
Pour t’assurer que la requête a bien été arrêtée, relance la requête initiale :
SELECT
pid,
user_name,
starttime,
query,
elapsed
FROM
stv_recents
WHERE
state = 'Running'
ORDER BY
elapsed DESC;
La requête arrêtée ne devrait plus apparaître dans les résultats.
Gérer les requêtes bloquées
Parfois, des requêtes se retrouvent bloquées et doivent être tuées pour libérer les ressources. Tu peux identifier les requêtes bloquées grâce à la table 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;
Résultat attendu :
| pid | user_name | db | query | blocked_by_pid | blocked_by_user |
|---|---|---|---|---|---|
| 5678 | analytics | reporting | SELECT count(*) FROM ?; | 9101 | Admin |
Pour tuer une requête bloquée, utilise la commande CANCEL comme montré plus haut :
CANCEL 5678;
Automatiser l’arrêt des requêtes
Pour les bases de données aux exigences de performance strictes, automatiser la détection et l’arrêt des requêtes longues peut être très utile. Voici un exemple de procédure qui arrête les requêtes dépassant un seuil donné :
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;
$$;
Points importants
- Permissions : seuls les utilisateurs disposant des permissions adéquates peuvent annuler des requêtes.
- Impact : arrêter une requête peut affecter les performances de l’application ou provoquer des incohérences de données si c’est mal fait.
- Surveillance : surveiller régulièrement les performances des requêtes aide à détecter les problèmes tôt.
Conclusion
Bien gérer les requêtes longues permet de garantir des performances optimales pour ton cluster Amazon Redshift. En suivant ces étapes, tu peux rapidement identifier et arrêter toute requête problématique. Mettre en place des solutions automatisées de surveillance et d’arrêt des requêtes t’aidera encore davantage à maintenir les performances.
Pense à tester toutes les commandes et tous les scripts dans un environnement hors production avant de les déployer en production, pour éviter toute interruption involontaire.
D’autres articles qui pourraient te plaire :
Beekeeper Studio est une interface de base de données gratuite & open source
Le meilleur outil de requêtes & éditeur SQL que j’aie jamais utilisé. Il m’offre tout ce dont j’ai besoin pour gérer ma base de données. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio est rapide, intuitif et facile à utiliser. Beekeeper prend en charge plein de bases de données et fonctionne parfaitement sous Windows, Mac et Linux.
Ce que les utilisateurs disent de Beekeeper Studio
« Beekeeper Studio a complètement remplacé mon ancien workflow SQL. C’est rapide, intuitif, et ça rend le travail sur les bases de données à nouveau agréable. »
« J’ai essayé beaucoup d’interfaces de base de données, mais Beekeeper trouve le parfait équilibre entre fonctionnalités et simplicité. Ça marche, tout simplement. »