Terminare una query
Prima di terminare una query, devi capire quali query stanno causando problemi. Usa questo SQL per elencare tutte le query in esecuzione con la relativa durata:
SELECT
pid,
user_name,
starttime,
query,
elapsed
FROM
stv_recents
WHERE
state = 'Running'
ORDER BY
elapsed DESC;
Output previsto:
| 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 colonna elapsed mostra da quanto tempo la query è in esecuzione.
Una volta individuata la query problematica (usando il pid dall'elenco sopra), puoi terminarla con questo comando:
CANCEL pid;
Esempio:
CANCEL 123;
Verificare la terminazione della query
Per assicurarti che la query sia stata terminata, esegui di nuovo la query iniziale:
SELECT
pid,
user_name,
starttime,
query,
elapsed
FROM
stv_recents
WHERE
state = 'Running'
ORDER BY
elapsed DESC;
La query terminata non dovrebbe più comparire nei risultati.
Gestire le query bloccate
A volte le query si bloccano e vanno terminate per liberare le risorse. Puoi individuare le query bloccate usando la tabella 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;
Output previsto:
| pid | user_name | db | query | blocked_by_pid | blocked_by_user |
|---|---|---|---|---|---|
| 5678 | analytics | reporting | SELECT count(*) FROM ?; | 9101 | Admin |
Per terminare una query bloccata, usa il comando CANCEL come visto prima:
CANCEL 5678;
Automatizzare la terminazione delle query
Per i database con requisiti di prestazioni stringenti, può essere utile automatizzare il rilevamento e la terminazione delle query di lunga durata. Ecco un esempio di procedura che termina le query in esecuzione oltre una soglia specificata:
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;
$$;
Considerazioni importanti
- Permessi: solo gli utenti con i permessi adeguati possono annullare le query.
- Impatto: terminare una query può influire sulle prestazioni dell'applicazione o causare incoerenze nei dati se fatto in modo scorretto.
- Monitoraggio: monitorare regolarmente le prestazioni delle query aiuta a individuare i problemi in anticipo.
Conclusione
Gestire bene le query di lunga durata ti aiuta a mantenere prestazioni ottimali nel tuo cluster Amazon Redshift. Seguendo questi passaggi puoi individuare e terminare rapidamente qualsiasi query problematica. Implementare soluzioni automatiche per il monitoraggio regolare e la terminazione delle query può aiutarti ulteriormente a mantenere le prestazioni.
Assicurati di testare tutti i comandi e gli script in un ambiente non di produzione prima di usarli in produzione, per evitare interruzioni involontarie.
Altri articoli che potrebbero piacerti:
Beekeeper Studio è una GUI per database gratuita & open source
Il miglior strumento per query & editor SQL che abbia mai usato. Offre tutto ciò che mi serve per gestire il mio database. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio è veloce, intuitivo e facile da usare. Beekeeper supporta tantissimi database e funziona alla grande su Windows, Mac e Linux.
Cosa dicono gli utenti di Beekeeper Studio
"Beekeeper Studio ha sostituito completamente il mio vecchio workflow SQL. È veloce, intuitivo e rende di nuovo piacevole lavorare con i database."
"Ho provato tante GUI per database, ma Beekeeper trova l'equilibrio perfetto tra funzionalità e semplicità. Funziona e basta."