Le query attive meno recenti, note anche come query in esecuzione da più tempo, sono un elenco di query attive nel database, ordinate in base al tempo di esecuzione. L'analisi di queste query può aiutare a identificare le cause della latenza del sistema e dell'utilizzo elevato della CPU man mano che si verificano.
Spanner fornisce una tabella integrata,SPANNER_SYS.OLDEST_ACTIVE_QUERIES
,
che elenca le query in esecuzione, incluse quelle contenenti istruzioni DML, ordinate
per ora di inizio, in ordine crescente. Non include le query sugli stream di modifiche.
Se il numero di query in esecuzione è elevato, i risultati potrebbero essere
limitato a un sottoinsieme di query totali a causa dei vincoli di memoria del sistema
sulla raccolta di questi dati. Di conseguenza, Spanner
fornisce una tabella aggiuntiva, SPANNER_SYS.ACTIVE_QUERIES_SUMMARY
, che mostra
le statistiche di riepilogo di tutte le query attive (ad eccezione delle query delle modifiche in tempo reale).
Puoi recuperare le informazioni da entrambe le tabelle integrate utilizzando il linguaggio SQL
istruzioni.
In questo documento, descriveremo entrambe le tabelle, mostreremo alcuni esempi di query che utilizzano queste tabelle e, infine, dimostrare come utilizzarle per mitigare i problemi sia causato da query attive.
Disponibilità
I dati di SPANNER_SYS
sono disponibili solo tramite le interfacce SQL. Ad esempio:
La pagina Spanner Studio di un database nella console Google Cloud
La
gcloud spanner databases execute-sql
comandoAPI
executeQuery
Gli altri metodi di lettura singoli forniti da Spanner non supportano
SPANNER_SYS
.
OLDEST_ACTIVE_QUERIES
SPANNER_SYS.OLDEST_ACTIVE_QUERIES
restituisce un elenco di query attive ordinate per
l'ora di inizio. Se il numero di query in esecuzione è elevato,
i risultati potrebbero essere limitati a un sottoinsieme di query totali a causa della memoria
i vincoli che Spanner applica alla raccolta di questi dati. A
visualizzare statistiche riepilogative per tutte le query attive, vedere
ACTIVE_QUERIES_SUMMARY
Schema tabella
Nome colonna | Tipo | Descrizione |
---|---|---|
START_TIME |
TIMESTAMP |
Ora di inizio della query. |
TEXT_FINGERPRINT |
INT64 |
L'impronta è un hash delle operazioni coinvolte nella transazione. |
TEXT |
STRING |
Il testo dell'istruzione della query. |
TEXT_TRUNCATED |
BOOL |
True se il testo della query nel campo TEXT è troncato; In caso contrario, è false. |
SESSION_ID |
STRING |
L'ID della sessione che esegue la query. Viene utilizzato per l'osservabilità. |
QUERY_ID . |
STRING |
L'ID della query. Utilizzerai questo ID con CALL cancel_query(query_id) per annullare la query. |
Esempi di query
Puoi eseguire le seguenti istruzioni SQL di esempio utilizzando il client librerie, Google Cloud CLI, oppure Console Google Cloud.
Elenca le query in esecuzione meno recenti
La seguente query restituisce un elenco delle query in esecuzione più vecchie ordinate in base al tempo di inizio della query.
SELECT start_time,
text_fingerprint,
text,
text_truncated,
session_id
FROM spanner_sys.oldest_active_queries
ORDER BY start_time ASC;
start_time | text_fingerprint | testo | text_truncated | session_id |
---|---|---|---|---|
2020-07-18T07:52:28.225877Z | -3426560921851907385 | SELECT a.SingerId, a.AlbumId, a.TrackId, b.SingerId come b_id, b.AlbumId come b_albumid, b.TrackId come b_trackId FROM Brani come CROSS JOIN Brani come b; | Falso | ACjbPvYsucrtcffHrRK6aObeIjZf12tSUwOsim-g1WC3IhqF4epzICCQR3GCHw |
2020-07-18T07:54:08.622081Z | -9206690983832919848 | SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Canzoni come JOIN Singers as s ON s.SingerId = a.SingerId WHERE STARTS_WITH(s.FirstName, 'FirstName') LIMIT 1000000; | Falso | ACFBPvaF3yKiNfxXFod2LPoFaXjKR759Bw1o34206vv0t7eOrD3wxZhu8U6ohQ |
2020-07-18T07:54:08.631744Z | -105437553161169030 | SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Songs as a JOIN Singers as s ON s.SingerId = a.SingerId WHERE a.SingerId > 7 LIMIT 1000000; | Falso | ACjbPvanq3MesDNT98t64KdKAz3TlDZoCC-zgW-FJn91cJHuczQ_cOFN_Hdflw |
2020-07-18T07:54:08.720011Z | -9206690983832919848 | SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Canzoni come JOIN Singers as s ON s.SingerId = a.SingerId WHERE STARTS_WITH(s.FirstName, 'FirstName') LIMIT 1000000; | Falso | AC3PvYIE2QHkhnmMXuAGpB4inK7yMnQjmYgQ9FoygKNaB5KCXu7Sf7f9aghYw |
2020-07-18T07:54:08.731006Z | 6561582859583559006 | SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Canzoni come JOIN Singers as s ON s.SingerId = a.SingerId WHERE a.SingerId > 10 LIMIT 1000000; | Falso | AC3PvYNZ06N2YyvwV0YMlSRBNDtXBqZEK-iAAyPFnFcTmshPvzWkhr034ud7w |
Elenco delle prime 2 query meno recenti in esecuzione
Una leggera variazione rispetto alla query precedente, questo esempio restituisce i primi 2 meno recenti query in esecuzione ordinate in base all'ora di inizio della query.
SELECT start_time,
text_fingerprint,
text,
text_truncated,
session_id
FROM spanner_sys.oldest_active_queries
ORDER BY start_time ASC LIMIT 2;
Output query
start_time | text_fingerprint | testo | text_truncated | session_id |
---|---|---|---|---|
2020-07-18T07:52:28.225877Z | -3426560921851907385 | SELECT a.SingerId, a.AlbumId, a.TrackId, b.SingerId come b_id, b.AlbumId come b_albumid, b.TrackId come b_trackId FROM Brani come CROSS JOIN Brani come b; | Falso | ACjbPvYsucrtcffHrRK6aObeIjZf12tSUwOsim-g1WC3IhqF4epzICCQR3GCHw |
2020-07-18T07:54:08.622081Z | -9206690983832919848 | SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Canzoni come JOIN Singers as s ON s.SingerId = a.SingerId WHERE STARTS_WITH(s.FirstName, 'FirstName') LIMIT 1000000; | Falso | ACFBPvaF3yKiNfxXFod2LPoFaXjKR759Bw1o34206vv0t7eOrD3wxZhu8U6ohQ |
ACTIVE_QUERIES_SUMMARY
Come suggerisce il nome, la tabella integrata SPANNER_SYS.ACTIVE_QUERIES_SUMMARY
,
mostra le statistiche di riepilogo per tutte le query attive. Come mostrato nello schema seguente, le query vengono raggruppate in base all'età in tre bucket o contatori: più di un secondo, più di 10 secondi e più di 100 secondi.
Schema tabella
Nome colonna | Tipo | Descrizione |
---|---|---|
ACTIVE_COUNT |
INT64 |
Il numero totale di query in esecuzione. |
OLDEST_START_TIME |
TIMESTAMP |
Un limite superiore all'ora di inizio della query in esecuzione meno recente. |
COUNT_OLDER_THAN_1S |
INT64 |
Il numero di query precedenti a un secondo. |
COUNT_OLDER_THAN_10S |
INT64 |
Il numero di query precedenti a 10 secondi. |
COUNT_OLDER_THAN_100S |
INT64 |
Il numero di query precedenti a 100 secondi. |
Una query può essere conteggiata in più di uno di questi bucket. Ad esempio, se un
è stata eseguita per 12 secondi, verrà conteggiata
COUNT_OLDER_THAN_1S
e COUNT_OLDER_THAN_10S
perché soddisfa entrambi
criteri.
Esempi di query
Puoi eseguire le seguenti istruzioni SQL di esempio utilizzando le librerie client, gcloud spanner o la console Google Cloud.
Recuperare un riepilogo delle query attive
La seguente query restituisce le statistiche di riepilogo sulle query in esecuzione.
SELECT active_count,
oldest_start_time,
count_older_than_1s,
count_older_than_10s,
count_older_than_100s
FROM spanner_sys.active_queries_summary;
Output query
active_count | oldest_start_time | count_older_than_1s | count_older_than_10s | count_older_than_100s |
---|---|---|---|---|
22 | 2020-07-18T07:52:28.225877Z | 21 | 21 | 1 |
Limitazioni
Nonostante l'obiettivo sia fornire gli approfondimenti più completi possibile, ci sono alcune circostanze in cui le query non sono incluse nei dati restituiti in queste tabelle.
Le query DML (AGGIORNA/INSERISCI/ELIMINA) non vengono incluse se sono nella Applica le mutazioni.
Una query non viene inclusa se è nel bel mezzo di un riavvio a causa di un un errore temporaneo.
Non sono incluse le query provenienti da server sovraccarichi o che non rispondono.
OLDEST_ACTIVE_QUERIES
non può essere utilizzato in una transazione di lettura/scrittura. Anche in una transazione di sola lettura, ignora il timestamp della transazione e restituisce sempre i dati correnti a partire dalla sua esecuzione. In rari casi, potrebbe restituire un erroreABORTED
con risultati parziali. In questo caso, ignora i risultati parziali e riprova a eseguire la query.
Usa i dati delle query attive per risolvere i problemi di utilizzo elevato della CPU
Statistiche sulle query e statistiche sulle transazioni forniscono informazioni utili per la risoluzione dei problemi di latenza in un database Spanner. Questi strumenti forniscono informazioni query già completate. Tuttavia, a volte è necessario sapere cosa è in esecuzione nel sistema. Ad esempio, considera lo scenario in cui l'utilizzo della CPU è piuttosto elevato e vuoi rispondere alle seguenti domande.
- Quante query sono in esecuzione al momento?
- Quali sono queste query?
- Il numero di query in esecuzione da molto tempo, ovvero maggiore di 100 secondi?
- In quale sessione è in esecuzione la query?
Rispondendo alle domande precedenti, puoi decidere di rispondere alle seguenti domande un'azione.
- Elimina la sessione che esegue la query per una risoluzione immediata.
- Migliora le prestazioni delle query aggiungendo un indice.
- Riduci la frequenza della query se è associata a una query periodica in background.
- Identifica l'utente o il componente che invia la query a cui potrebbe non essere autorizzato eseguire la query.
In questa procedura dettagliata, esaminiamo le query attive e determiniamo eventuali provvedimenti da adottare.
Recuperare un riepilogo delle query attive
Nel nostro scenario di esempio, notiamo un utilizzo della CPU superiore al normale, quindi decidiamo di eseguire la seguente query per restituire un riepilogo delle query attive.
SELECT active_count,
oldest_start_time,
count_older_than_1s,
count_older_than_10s,
count_older_than_100s
FROM spanner_sys.active_queries_summary;
La query restituisce i seguenti risultati.
active_count | oldest_start_time | count_older_than_1s | count_older_than_10s | count_older_than_100s |
---|---|---|---|---|
22 |
2020-07-18T07:52:28.225877Z |
21 |
21 |
1 |
A quanto pare abbiamo una query in esecuzione per più di 100 secondi. Questo è insolito per il nostro database, quindi vogliamo effettuare ulteriori accertamenti.
Recupera un elenco di query attive
Nel passaggio precedente abbiamo stabilito che una query è in esecuzione per oltre 100 secondi.Per ulteriori indagini, eseguiamo la seguente query per restituire informazioni sulle prime 5 query in esecuzione meno recenti.
SELECT start_time,
text_fingerprint,
text,
text_truncated,
session_id,
query_id
FROM spanner_sys.oldest_active_queries
ORDER BY start_time ASC LIMIT 5;
In questo esempio, abbiamo eseguito la query il 28 marzo 2024 alle 16:44:09 circa. EDT e ha restituito i seguenti risultati. Potresti dover scorrere orizzontalmente per vedere l'intero output.
start_time | text_fingerprint | testo | text_truncated | session_id | query_id |
---|---|---|---|---|---|
28-03-2024 16:44:09.356939+00:00 | -2833175298673875968 | seleziona * da spanner_sys.oldest_active_queries | falso | AC3PvYsucrtcffHrRK6aObeIjZf12tSUwOsim-g1WC3IhqF4epzICCQR3GCHw | 37190103859320827 |
2020-07-18T07:52:28.225877Z | -3426560921851907385 | SELECT a.SingerId, a.AlbumId, a.TrackId, b.SingerId come b_id, b.AlbumId come b_albumid, b.TrackId come b_trackId FROM Brani come CROSS JOIN Brani come b; | falso | ACjbPvaF3yKiNfxXFod2LPoFaXjKR759Bw1o34206vv0t7eOrD3wxZhu8U6ohQ | 48946620525959556 |
La query meno recente (impronta = -2833175298673875968
) è evidenziata nella
tabella. È un CROSS JOIN
costoso. Decidiamo quindi di agire.
Annullare una query costosa
In questo esempio, abbiamo trovato una query che eseguiva un CROSS JOIN
costoso, quindi
decidiamo di annullare la query. I risultati della query che abbiamo ricevuto nella
includeva un valore query_id
. Possiamo eseguire
il comando CALL cancel_query(query_id)
per GoogleSQL e
spanner.cancel_query(query_id)
per PostgreSQL per
annullare la query.
GoogleSQL
CALL cancel_query(query_id)
PostgreSQL
CALL spanner.cancel_query(query_id)
Ad esempio, nell'esempio seguente, l'istruzione CALL
annulla una query con
ID 37190103859320827
:
CALL cancel_query('37190103859320827')
Devi eseguire una query sulla tabella spanner_sys.oldest_active_queries
per verificare che
la query viene annullata.
Questa procedura dettagliata illustra come utilizzare SPANNER_SYS.OLDEST_ACTIVE_QUERIES
e
SPANNER_SYS.ACTIVE_QUERIES_SUMMARY
per analizzare le nostre query in esecuzione e
intervenire se necessario per le query che contribuiscono a un elevato utilizzo della CPU. Di
ovviamente, è sempre più economico evitare operazioni costose e progettare
lo schema più adatto ai tuoi casi d'uso. Per ulteriori informazioni sulla creazione di query
eseguite in modo efficiente, consulta le best practice per SQL.
Passaggi successivi
- Scopri di più sugli altri strumenti di introspezione.
- Scopri di più sulle altre informazioni che Spanner archivia per ogni database nelle tabelle dello schema di informazioni del database.
- Scopri di più sulle best practice SQL per Spanner.