Query attive meno recenti, note anche come query più lunghe, è un elenco di query attive nel tuo database, ordinate in base alla durata di esecuzione. Ottenere informazioni dettagliate su queste query può aiutare a identificare le cause della latenza del sistema e dell'utilizzo elevato della CPU mentre 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 di stream di modifiche.
Se sono in esecuzione molte query, i risultati potrebbero essere
limitati a un sottoinsieme del totale delle query a causa dei vincoli di memoria che
il sistema impone alla raccolta di questi dati. Pertanto,
Spanner fornisce una tabella aggiuntiva,
SPANNER_SYS.ACTIVE_QUERIES_SUMMARY, che mostra statistiche riepilogative per tutte le
query attive (ad eccezione delle query sui flussi di modifiche).
Puoi recuperare informazioni da entrambe queste tabelle integrate utilizzando istruzioni SQL.
In questo documento descriveremo entrambe le tabelle, mostreremo alcune query di esempio che le utilizzano e, infine, dimostreremo come utilizzarle per contribuire a mitigare i problemi causati dalle query attive.
Accedere alle statistiche sulle query attive meno recenti
I dati di SPANNER_SYS sono disponibili solo tramite interfacce SQL, ad esempio:
La pagina Spanner Studio di un database nella console Google Cloud
Il comando
gcloud spanner databases execute-sqlIl metodo
executeSqlo il metodoexecuteStreamingSql
Spanner non supporta SPANNER_SYS con i seguenti metodi di lettura singola:
- Esecuzione di una lettura coerente da una o più righe di una tabella.
- Esecuzione di una lettura obsoleta da una o più righe di una tabella.
- Lettura da una singola riga o da più righe in un indice secondario.
Statistiche OLDEST_ACTIVE_QUERIES
SPANNER_SYS.OLDEST_ACTIVE_QUERIES restituisce un elenco di query attive ordinate in base
all'ora di inizio. Se sono in esecuzione molte query, i risultati potrebbero essere limitati a un sottoinsieme del totale delle query a causa dei vincoli di memoria imposti da Spanner alla raccolta di questi dati. Per
visualizzare le statistiche di riepilogo per tutte le query attive, consulta
ACTIVE_QUERIES_SUMMARY.
Schema per la tabella delle statistiche di tutte le query attive meno recenti
| Nome colonna | Tipo | Descrizione |
|---|---|---|
START_TIME |
TIMESTAMP |
Ora di inizio della query. |
TEXT_FINGERPRINT |
INT64 |
L'impronta è un hash del tag di richiesta o, se non è presente un tag, un hash del testo della query. |
TEXT |
STRING |
Il testo dell'istruzione query. |
TEXT_TRUNCATED |
BOOL |
Se il testo della query nel campo TEXT viene troncato, questo valore è TRUE. Se il testo della query non viene troncato, questo valore è FALSE.
|
SESSION_ID |
STRING |
L'ID della sessione che esegue la query. |
QUERY_ID |
STRING |
L'ID della query. Puoi utilizzare questo ID con
CALL cancel_query(query_id) per annullare la query. |
CLIENT_IP_ADDRESS |
STRING |
L'indirizzo IP del client che ha richiesto la query. A volte, l'indirizzo IP client potrebbe essere oscurato. L'indirizzo IP mostrato qui è coerente con i log di controllo e segue le stesse linee guida per la modifica. Per saperne di più, vedi Indirizzo IP del chiamante nei log di controllo. Ti consigliamo di richiedere l'indirizzo IP del client solo quando è necessario, in quanto le richieste di indirizzi IP del client potrebbero comportare una latenza aggiuntiva. |
API_CLIENT_HEADER |
STRING |
L'intestazione api_client
dal client.
|
USER_AGENT_HEADER |
STRING |
L'intestazione user_agent ricevuta da Spanner
dal client.
|
SERVER_REGION |
STRING |
La regione in cui il server radice Spanner elabora la query. Per maggiori informazioni, vedi Ciclo di vita di una query. |
PRIORITY |
STRING |
La priorità della query. Per visualizzare le priorità disponibili, consulta RequestOptions. |
TRANSACTION_TYPE |
STRING |
Il tipo di transazione della query. I valori possibili sono
READ_ONLY, READ_WRITE e NONE. |
Esempi di query
Puoi eseguire i seguenti esempi di istruzioni SQL utilizzando le librerie client, Google Cloud CLI o la Google Cloud console.
Elenca le query attive in esecuzione meno recenti
La seguente query restituisce un elenco delle query in esecuzione meno recenti ordinate in base all'ora di inizio della query.
SELECT start_time,
text_fingerprint,
text,
text_truncated,
session_id,
query_id,
api_client_header,
server_region,
priority,
transaction_type
FROM spanner_sys.oldest_active_queries
ORDER BY start_time ASC;
Output della query
La tabella seguente mostra l'output dell'esecuzione della query menzionata in precedenza:
| start_time | text_fingerprint | testo | text_truncated | session_id | query_id | api_client_header | server_region | priorità | transaction_type |
|---|---|---|---|---|---|---|---|---|---|
| 2025-05-20T03:29:54.287255Z | -3426560921851907385 | SELECT a.SingerId, a.AlbumId, a.TrackId, b.SingerId as b_id, b.AlbumId as b_albumid, b.TrackId as b_trackId FROM Songs as a CROSS JOIN Songs as b; | FALSE | AG46FS6K3adF | 9023439241169932454 | gl-go/1.25.0-20250216-RC00 gccl/1.73.0 gapic/1.73.0 gax/2.14.1 grpc/1.69.2 | us-central1 | PRIORITY_HIGH | READ_ONLY |
| 2025-05-20T03:31:52.40808Z | 1688332608621812214 | 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 STARTS_WITH(s.FirstName, 'FirstName') LIMIT 1000000; | FALSE | AG46FS6paJPKDOb | 2729381896189388167 | gl-go/1.25.0-20250216-RC00 gccl/1.73.0 gapic/1.73.0 gax/2.14.1 grpc/1.69.2 | us-central1 | PRIORITY_HIGH | READ_WRITE |
| 2025-05-20T03:31:52.591212Z | 6561582859583559006 | 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 > 10 LIMIT 1000000; | FALSE | AG46FS7Pb_9H6J6p | 9125776389780080794 | gl-go/1.25.0-20250216-RC00 gccl/1.73.0 gapic/1.73.0 gax/2.14.1 grpc/1.69.2 | us-central1 | PRIORITY_LOW | READ_ONLY |
Elenco delle due query in esecuzione da più tempo
Una leggera variazione della query precedente, questo esempio restituisce le prime due query in esecuzione più vecchie 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 della query
La tabella seguente mostra l'output dell'esecuzione della query menzionata in precedenza:
| start_time | text_fingerprint | testo | text_truncated | session_id |
|---|---|---|---|---|
| 2039-07-18T07:52:28.225877Z | -3426560921851907385 | SELECT a.SingerId, a.AlbumId, a.TrackId, b.SingerId as b_id, b.AlbumId as b_albumid, b.TrackId as b_trackId FROM Songs as a CROSS JOIN Songs as b; | Falso | ACjbPvYsuRt |
| 2039-07-18T07:54:08.622081Z | -9206690983832919848 | 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 STARTS_WITH(s.FirstName, 'FirstName') LIMIT 1000000; | Falso | ACjbPvaF3yK |
ACTIVE_QUERIES_SUMMARY
La tabella delle statistiche SPANNER_SYS.ACTIVE_QUERIES_SUMMARY
mostra le statistiche riassuntive per tutte le query attive. Le query sono raggruppate nei seguenti bucket:
- più vecchio di 1 secondo
- più vecchio di 10 secondi
- più vecchio di 100 secondi
Schema della tabella per ACTIVE_QUERIES_SUMMARY
| Nome colonna | Tipo | Descrizione |
|---|---|---|
ACTIVE_COUNT |
INT64 |
Il numero totale di query in esecuzione. |
OLDEST_START_TIME |
TIMESTAMP |
Un limite superiore per l'ora di inizio della query in esecuzione meno recente. |
COUNT_OLDER_THAN_1S |
INT64 |
Il numero di query più vecchie di 1 secondo. |
COUNT_OLDER_THAN_10S |
INT64 |
Il numero di query più vecchie di 10 secondi. |
COUNT_OLDER_THAN_100S |
INT64 |
Il numero di query più vecchie di 100 secondi. |
Una query può essere conteggiata in più di uno di questi bucket. Ad esempio, se una
query è in esecuzione da 12 secondi, verrà conteggiata in
COUNT_OLDER_THAN_1S e COUNT_OLDER_THAN_10S perché soddisfa entrambi
i criteri.
Esempi di query
Puoi eseguire i seguenti esempi di istruzioni SQL utilizzando le librerie client, gcloud spanner o la Google Cloud console.
Recuperare un riepilogo delle query attive
La seguente query restituisce le statistiche riepilogative sull'esecuzione delle query.
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 della query
| active_count | oldest_start_time | count_older_than_1s | count_older_than_10s | count_older_than_100s |
|---|---|---|---|---|
| 22 | 2039-07-18T07:52:28.225877Z | 21 | 21 | 1 |
Limitazioni
Sebbene l'obiettivo sia quello di fornirti le informazioni più complete possibili, ci sono alcune circostanze in cui le query non sono incluse nei dati restituiti in queste tabelle.
Le query DML (
UPDATE,INSERT,DELETE) non sono incluse se si trovano nella fase Applica mutazioni.Una query non viene inclusa se è in fase di riavvio a causa di un errore temporaneo.
Le query provenienti da server sovraccarichi o che non rispondono non sono incluse.
La lettura o l'interrogazione dalla tabella
OLDEST_ACTIVE_QUERIESnon può essere eseguita in una transazione di lettura/scrittura. Anche in una transazione di sola lettura, ignora il timestamp della transazione e restituisce sempre i dati correnti al momento dell'esecuzione. In rari casi, potrebbe restituire un erroreABORTEDcon risultati parziali; in questo caso, scarta i risultati parziali e riprova a eseguire la query.Se la colonna
CLIENT_IP_ADDRESSrestituisce una stringa<error>, indica un problema temporaneo che non dovrebbe influire sul resto della query. Riprova a eseguire la query per recuperare l'indirizzo IP del client.
Utilizzare i dati delle query attive per risolvere i problemi relativi all'utilizzo elevato della CPU
Le statistiche sulle query e le statistiche sulle transazioni forniscono informazioni utili per la risoluzione dei problemi di latenza in un database Spanner. Questi strumenti forniscono informazioni sulle 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?
- Che cosa sono queste query?
- Quante query sono in esecuzione da molto tempo, ovvero da più di 100 secondi?
- Quale sessione sta eseguendo la query?
Con le risposte alle domande precedenti, potresti decidere di intraprendere la seguente 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 un'attività periodica in background.
- Identifica l'utente o il componente che emette la query che potrebbe non essere autorizzato a eseguirla.
In questa procedura dettagliata, esaminiamo le query attive e determiniamo quale azione intraprendere, se presente.
Recuperare un riepilogo delle query attive
Nello 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 produce i seguenti risultati.
| active_count | oldest_start_time | count_older_than_1s | count_older_than_10s | count_older_than_100s |
|---|---|---|---|---|
22 |
2039-07-18T07:52:28.225877Z |
21 |
21 |
1 |
Abbiamo una query in esecuzione da più di 100 secondi. Si tratta di un evento insolito per il nostro database, pertanto vogliamo effettuare ulteriori accertamenti.
Recuperare un elenco di query attive
Nel passaggio precedente abbiamo stabilito che una query è in esecuzione da oltre 100 secondi.Per ulteriori accertamenti, eseguiamo la seguente query per restituire maggiori informazioni sulle 5 query in esecuzione più vecchie.
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 ore 16:44:09 circa EDT e sono stati restituiti i seguenti risultati. Potrebbe essere necessario scorrere in orizzontale per visualizzare l'intero output.
| start_time | text_fingerprint | testo | text_truncated | session_id | query_id |
|---|---|---|---|---|---|
| 2024-03-28 16:44:09.356939+00:00 | -2833175298673875968 | select * from spanner_sys.oldest_active_queries | falso | ACjbPvYsucrtcffHrRK6aObeIjZf12tSUwOsim-g1WC3IhqF4epzICCQR3GCHw | 37190103859320827 |
| 2039-07-18T07:52:28.225877Z | -3426560921851907385 | SELECT a.SingerId, a.AlbumId, a.TrackId, b.SingerId as b_id, b.AlbumId as b_albumid, b.TrackId as b_trackId FROM Songs as a CROSS JOIN Songs as b; | falso | ACjbPvaF3yKiNfxXFod2LPoFaXjKR759Bw1o34206vv0t7eOrD3wxZhu8U6ohQ | 48946620525959556 |
La query meno recente (fingerprint = -2833175298673875968) è evidenziata nella
tabella. È un CROSS JOIN costoso. Decidiamo di intraprendere un'azione.
Annullare una query costosa
In questo esempio, abbiamo trovato una query che eseguiva un'operazione CROSS JOIN costosa, quindi
decidiamo di annullarla. I risultati della query che abbiamo ricevuto nel passaggio precedente includevano un query_id. Possiamo eseguire il seguente comando
CALL cancel_query(query_id) per GoogleSQL e il comando
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, nella seguente istruzione CALL viene annullata una query con l'ID 37190103859320827:
CALL cancel_query('37190103859320827')
Devi interrogare la spanner_sys.oldest_active_queries tabella per verificare che la
query sia stata annullata.
Questa procedura dettagliata mostra come utilizzare SPANNER_SYS.OLDEST_ACTIVE_QUERIES e
SPANNER_SYS.ACTIVE_QUERIES_SUMMARY per analizzare le query in esecuzione e intervenire
se necessario su quelle che contribuiscono a un elevato utilizzo della CPU. Naturalmente, è sempre più economico evitare operazioni costose e progettare lo schema giusto per i tuoi casi d'uso. Per ulteriori informazioni sulla creazione di istruzioni SQL
che vengono eseguite in modo efficiente, consulta Best practice per SQL.
Passaggi successivi
- Scopri di più su altri strumenti di introspezione.
- Scopri di più sulle altre informazioni archiviate da Spanner per ogni database nelle tabelle dello schema informativo del database.
- Scopri di più sulle best practice per SQL per Spanner.