Risolvere i problemi relativi alle query
Questo documento ha lo scopo di aiutarti a risolvere i problemi più comuni relativi a: di query in esecuzione, ad esempio identificando i motivi di lentezza delle query i passaggi per risolvere gli errori comuni restituiti da query non riuscite.
Risolvere i problemi relativi alle query lente
Quando risolvi i problemi di lentezza delle prestazioni delle query, considera i seguenti aspetti comuni cause:
Controlla lo stato di Google Cloud Service Health pagina per le interruzioni note del servizio BigQuery che potrebbero influire sulle query delle prestazioni.
Rivedi la sequenza temporale del lavoro per la tua query nella pagina dei dettagli dell'offerta di lavoro. per vedere il tempo necessario per l'esecuzione di ogni fase della query.
Se la maggior parte del tempo trascorso è dovuta a tempi di creazione lunghi, contatta l'assistenza clienti Google Cloud per ricevere assistenza.
Se la maggior parte del tempo trascorso è dovuta a tempi di esecuzione lunghi, esamina gli approfondimenti sul rendimento delle query. Gli insight sulle prestazioni delle query possono indicarti se la tua query è stata eseguita più a lungo del tempo medio di esecuzione e suggerire possibili cause. Le cause possibili potrebbero includere la contesa degli slot di query o un errore insufficiente quota di shuffling. Per ulteriori informazioni su ciascun problema di prestazioni delle query e sulle possibili risoluzioni, consulta Interpreta gli approfondimenti sul rendimento delle query.
Esamina i byte elaborati nella pagina dei dettagli del job di query. per vedere se è più alto del previsto. Per farlo, puoi confrontare il numero di byte elaborati dalla query corrente con un altro job di query completato in un periodo di tempo accettabile. Se esiste una grande discrepanza di byte elaborati tra le due query, è possibile che la query sia stata lenta a causa di un volume elevato di dati. Per informazioni su come ottimizzare le query per gestire grandi volumi di dati, consulta Ottimizzare il calcolo delle query.
Puoi anche identificare le query nel tuo progetto che elaborano una grande quantità di dati cercando le query più costose utilizzando la visualizzazione
INFORMATION_SCHEMA.JOBS
.
Se non riesci ancora a trovare il motivo del rendimento delle query inferiore alle aspettative, contatta l'assistenza clienti Google Cloud per ricevere assistenza.
Risoluzione dello schema Avro
Stringa di errore: Cannot skip stream
Questo errore può verificarsi quando vengono caricati più file Avro con schemi diversi, causando un problema di risoluzione dello schema e causando l'esito negativo del job di importazione casuale file.
Per risolvere questo errore, assicurati che l'ultimo file alfabetico nel job di caricamento contiene il soprainsieme (unione) degli schemi differenti. Questo è un requisito in base al modo in cui Avro gestisce la risoluzione dello schema.
Query simultanee in conflitto
Stringa di errore: Concurrent jobs in the same session are not allowed
Questo errore può verificarsi quando più query vengono eseguite contemporaneamente in una sessione, il che non è supportato. Consulta le limitazioni della sessione.
Istruzioni DML in conflitto
Stringa di errore: Could not serialize access to table due to concurrent update
Questo errore può verificarsi quando le istruzioni DML (Data Manipulation Language) con mutazioni che vengono eseguite contemporaneamente nella stessa tabella sono in conflitto tra loro o quando la tabella viene troncata durante un'istruzione DML con mutazioni. Per ulteriori informazioni, consulta Conflitti di istruzioni DML.
Per risolvere questo errore, esegui operazioni DML che interessano una singola tabella, in modo che non si sovrappongono.
Sottoquery correlate
Stringa di errore: Correlated subqueries that reference other tables are not
supported unless they can be de-correlated
Questo errore può verificarsi quando la query contiene una sottoquery che fa riferimento a una colonna esterna alla sottoquery, chiamata colonna di correlazione. La sottoquery correlata viene valutata utilizzando un'esecuzione nidificata inefficiente in cui la sottoquery viene valutata per ogni riga della query esterna che produce le colonne di correlazione. A volte, BigQuery riscrivere internamente le query con sottoquery correlate in modo più efficiente. L'errore delle sottoquery correlate si verifica quando BigQuery non riesce a ottimizzare sufficientemente la query.
Per risolvere questo errore, prova a procedere nel seguente modo:
- Rimuovi eventuali clausole
ORDER BY
,LIMIT
,EXISTS
,NOT EXISTS
oIN
da la tua sottoquery. - Utilizza una query con più istruzioni per creare una tabella temporanea a cui fare riferimento nella sottoquery.
- Riscrivi la query per utilizzare invece un
CROSS JOIN
.
Autorizzazioni di controllo dell'accesso a livello di colonna insufficienti
Stringa di errore: Requires raw access permissions on the read columns to execute the DML statements
Questo errore si verifica quando tenti di usare DELETE
, UPDATE
o MERGE
DML
senza disporre dell'autorizzazione Lettore granulare nella versione scansionata.
colonne che utilizzano il controllo dell'accesso a livello di colonna per limitare l'accesso nella colonna
livello. Per ulteriori informazioni, vedi
Impatto sulle scritture dal controllo dell'accesso a livello di colonna.
Credenziali non valide per le query pianificate
Stringhe di errore:
Error code: INVALID_USERID
Error code 5: Authentication failure: User Id not found
PERMISSION_DENIED: BigQuery: Permission denied while getting Drive credentials
Questo errore può verificarsi quando una query pianificata non va a buon fine a causa di credenziali obsolete, in particolare quando esegui query sui dati di Google Drive.
Per risolvere questo errore:
- Assicurati di aver abilitato BigQuery Data Transfer Service, che è un prerequisito per l'utilizzo query pianificate.
- Aggiorna le credenziali per la query pianificata.
Credenziali dell'account di servizio non valide
Stringa di errore: HttpError 403 when requesting returned: The caller does not have permission
Questo errore potrebbe verificarsi quando provi a configurare una query pianificata con un account di servizio. Per risolvere questo errore, consulta la procedura di risoluzione dei problemi in Problemi di autorizzazione e autorizzazione.
Ora snapshot non valida
Stringa di errore: Invalid snapshot time
Questo errore può verificarsi quando si cerca di eseguire query su dati storici al di fuori del finestra di spostamento cronologico per il set di dati. Per risolvere questo errore, modifica la query per accedere ai dati storici all'interno della finestra di spostamento cronologico del set di dati.
Questo errore può verificarsi anche se una delle tabelle utilizzate nella query viene eliminata e ricreata dopo l'avvio della query. Controlla se è presente un'applicazione o una query pianificata che esegue questa operazione ed è stata eseguita contemporaneamente alla query non riuscita. In caso affermativo, prova a spostare il processo che esegue il calo, ricrea l'operazione da eseguire in un momento che non sia in conflitto con le query leggi la tabella.
Il job esiste già
Stringa di errore: Already Exists: Job <job name>
Questo errore può verificarsi per i job di query che devono valutare array di grandi dimensioni, in modo che
la creazione di un job di query richieda più tempo della media. Ad esempio, un
query con una clausola WHERE
come WHERE column IN (<2000+ elements array>)
.
Per correggere questo errore:
- Consenti a BigQuery di generare un
valore
jobId
casuale anziché specificarne uno. - Utilizza una query con parametri per caricare l'array.
Job non trovato
Stringa di errore: Job not found
Questo errore può verificarsi in risposta a un
Chiamata getQueryResults
,
in cui non viene specificato alcun valore per il campo location
. In questo caso,
Riprova a effettuare la chiamata e fornisci un valore location
.
Per ulteriori informazioni, consulta Evitare più valutazioni delle stesse espressioni comuni delle tabelle (CTE).
La query supera il limite di tempo di esecuzione
Stringa di errore: Query fails due to reaching the execution time limit
Se la query raggiunge il
limite di tempo di esecuzione delle query, controlla il
tempo di esecuzione delle esecuzioni precedenti della query eseguendo una query sulla
visualizzazione INFORMATION_SCHEMA.JOBS
con una query simile al seguente esempio:
SELECT TIMESTAMP_DIFF(end_time, start_time, SECOND) AS runtime_in_seconds FROM `region-us`.INFORMATION_SCHEMA.JOBS WHERE statement_type = 'QUERY' AND query = "my query string";
Se le esecuzioni precedenti della query hanno richiesto molto meno tempo, utilizza approfondimenti sulle prestazioni delle query per determinare e risolvere il problema di fondo.
La risposta alla query è troppo grande
Stringa di errore: responseTooLarge
Questo errore si verifica quando i risultati della query sono più grandi della dimensione massima della risposta.
Per risolvere questo errore, segui le indicazioni fornite per il
messaggio di errore responseTooLarge
.
Troppe istruzioni DML
Stringa di errore: Too many DML statements outstanding against <table-name>, limit is 20
Questo errore si verifica quando superi il limite di 20 istruzioni DML
con stato PENDING
in una coda per una singola tabella. Questo errore di solito si verifica
quando invii job DML su una singola tabella più velocemente rispetto a BigQuery
possono elaborare.
Una possibile soluzione è raggruppare più operazioni DML più piccole in ma meno job, ad esempio mediante il raggruppamento in batch di aggiornamenti e inserimenti. Quando raggruppi lavori più piccoli in lavori più grandi, il costo di esecuzione dei lavori più grandi viene ammortizzato l'esecuzione è più rapida. Consolidamento di istruzioni DML che interessano gli stessi dati migliora generalmente l'efficienza dei job DML ed è meno probabile che superi alla dimensione massima della coda. Per ulteriori informazioni sull'ottimizzazione delle operazioni DML, consulta Evitare istruzioni DML che aggiornano o inseriscono singole righe.
Altre soluzioni per migliorare l'efficienza di DML potrebbero essere la partizione o il clustering le tue tabelle. Per saperne di più, consulta le best practice.
L'utente non dispone dell'autorizzazione
Stringhe di errore:
Access Denied: Project [project_id]: User does not have bigquery.jobs.create permission in project [project_id].
User does not have permission to query table project-id:dataset.table.
Questo errore si verifica quando esegui una query senza l'autorizzazione bigquery.jobs.create
per il progetto da cui esegui la query, indipendentemente dalle tue autorizzazioni per il progetto che contiene i dati. Devi inoltre disporre dell'autorizzazione bigquery.tables.getData
su tutte le tabelle e le viste a cui fa riferimento la query.
Questo errore può verificarsi anche se la tabella non esiste nella regione interrogata, come asia-south1
. Per eseguire query sulle visualizzazioni, devi disporre di questa autorizzazione anche su tutte le tabelle e le visualizzazioni sottostanti. Per ulteriori informazioni sulle autorizzazioni richieste,
consulta Eseguire una query.
Per risolvere questo errore, tieni presente quanto segue:
Account di servizio: gli account di servizio devono avere l'
bigquery.jobs.create
l'autorizzazione di accesso al progetto da cui vengono eseguite.Ruoli personalizzati: i ruoli IAM personalizzati devono avere l'autorizzazione
bigquery.jobs.create
inclusa esplicitamente nel ruolo pertinente.Set di dati condivisi: quando lavori con set di dati condivisi in un progetto separato, potresti comunque aver bisogno dell'autorizzazione
bigquery.jobs.create
nel progetto per eseguire query o job in quel set di dati.
Per concedere l'autorizzazione ad accedere alla tabella
Per concedere l'autorizzazione di accesso a una tabella a un principio:
Vai alla pagina BigQuery.
In Explorer, vai alla tabella a cui vuoi accedere, seleziona
Visualizza azioni, seleziona Condividi, quindi fai clic su Gestisci autorizzazioni.In Aggiungi entità, inserisci il nome degli utenti, dei gruppi, dei domini che vuoi aggiungere.
In Assegna ruoli, seleziona l'autorizzazione
bigquery.jobs.create
. In alternativa, puoi concedere il ruoloroles/bigquery.jobUser
nel progetto da cui viene eseguita la query per ottenere le autorizzazioni necessarie.Fai clic su Salva.
Problemi relativi al superamento delle risorse
I seguenti problemi si verificano quando BigQuery non dispone di risorse sufficienti per completare la query.
La query supera le risorse della CPU
Stringa di errore: Query exceeded resource limits
Questo errore si verifica quando le query on demand utilizzano troppa CPU rispetto al quantità di dati scansionati. Per informazioni su come risolvere questi problemi, consulta Risolvi i problemi relativi al superamento della soglia.
La query supera le risorse di memoria
Stringa di errore: Resources exceeded during query execution: The query could not be executed in the allotted memory
Per
le istruzioneSELECT
,
questo errore si verifica quando la query utilizza troppe risorse.
Per risolvere questo errore, vedi Risolvere i problemi.
dei problemi relativi al superamento della soglia.
La query supera le risorse di ordinamento casuale
Stringa di errore: Resources exceeded during query execution: Your project or organization exceeded the maximum disk and memory limit available for shuffle operations
Questo errore si verifica quando una query non riesce ad accedere a risorse di shuffling sufficienti.
Per correggere questo errore, esegui il provisioning di più slot o riduci la quantità di dati elaborati dalla query. Per ulteriori informazioni su come fare, vedi Quota di shuffle insufficiente.
Per ulteriori informazioni su come risolvere questi problemi, consulta l'articolo sulla risoluzione dei problemi dei problemi relativi al superamento della soglia.
La query è troppo complessa
Stringa di errore: Resources exceeded during query execution: Not enough resources for query planning - too many subqueries or query is too complex
Questo errore si verifica quando una query è troppo complessa. Le cause principali più complesse sono:
WITH
clausole che sono molto nidificate o utilizzate ripetutamente.- Visualizzazioni nidificate in modo molto approfondito o utilizzate ripetutamente.
- Utilizzo ripetuto dell'operatore
UNION ALL
.
Per risolvere questo errore, prova le seguenti opzioni:
- Suddividi la query in più query, quindi utilizza linguaggio procedurale eseguire queste query in sequenza con stato condiviso.
- Utilizza tabelle temporanee invece delle clausole
WITH
. - Riscrivi la query per ridurre il numero di oggetti di riferimento e confronti.
Puoi monitorare in modo proattivo le query che stanno per raggiungere il limite di complessità
utilizzando il campo query_info.resource_warning
nella
INFORMATION_SCHEMA.JOBS
visualizzazione.
L'esempio seguente restituisce query con un elevato utilizzo delle risorse per gli
ultimi tre giorni:
SELECT
ANY_VALUE(query) AS query,
MAX(query_info.resource_warning) AS resource_warning
FROM
<your_project_id>.`region-us`.INFORMATION_SCHEMA.JOBS
WHERE
creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 3 DAY)
AND query_info.resource_warning IS NOT NULL
GROUP BY
query_info.query_hashes.normalized_literals
LIMIT
1000
Per ulteriori informazioni su come risolvere questi problemi, vedi Risolvere i problemi relativi al superamento delle risorse.
Risolvere i problemi relativi al superamento della soglia di risorse
Per i job di query:
Per ottimizzare le query, prova a svolgere i seguenti passaggi:
- Prova a rimuovere una clausola
ORDER BY
. - Se la query utilizza
JOIN
, assicurati che la tabella più grande si trovi a sinistra della clausola. - Se la query utilizza
FLATTEN
, determina se è necessaria per il tuo caso d'uso. Per ulteriori informazioni, consulta Dati nidificati e ripetuti. - Se la tua query utilizza
EXACT_COUNT_DISTINCT
, valuta la possibilità di usareCOUNT(DISTINCT)
. - Se la query utilizza
COUNT(DISTINCT <value>, <n>)
con un valore<n>
elevato, valuta la possibilità di utilizzareGROUP BY
. Per ulteriori informazioni, vediCOUNT(DISTINCT)
. - Se la query utilizza
UNIQUE
, valuta la possibilità di utilizzareGROUP BY
o una funzione finestra all'interno di un sottoselettore. - Se la query materializza molte righe utilizzando una clausola
LIMIT
, valuta la possibilità di applicare un filtro in base a un'altra colonna, ad esempioROW_NUMBER()
, o rimuovendo completamente la clausolaLIMIT
per consentire il caricamento in contemporanea in scrittura. - Se la query utilizza viste nidificate in modo molto approfondito e una clausola
WITH
, può verificarsi un aumento esponenziale della complessità, raggiungendo così i limiti. - Non sostituire le tabelle temporanee con clausole
WITH
. La clausola potrebbe dover essere ricalcolato più volte, il che può rendere la query complessa e di conseguenza lenta. I risultati intermedi persistenti in tabelle temporanee aiutano invece con complessità - Evita di utilizzare query
UNION ALL
.
Per maggiori informazioni, consulta le seguenti risorse:
- Ottimizza il calcolo delle query.
- Ottenere maggiori dettagli sull'avviso relativo alle risorse
- Monitora l'integrità, l'utilizzo delle risorse e i job
Per i job di caricamento:
Se carichi file Avro o Parquet, riduci le dimensioni delle righe nei file. Verifica le limitazioni specifiche relative alle dimensioni per il formato del file che stai caricando:
Se ricevi questo errore durante il caricamento dei file ORC, contatta l'assistenza.
Per l'API Storage:
Stringa di errore: Stream memory usage exceeded
Durante una chiamata ReadRows
dell'API Storage Read, alcuni stream con un elevato utilizzo della memoria potrebbero generare un errore RESOURCE_EXHAUSTED
con questo messaggio.
Ciò può accadere durante la lettura da tabelle ampie o con uno schema complesso. Come soluzione,
riduci le dimensioni delle righe del risultato selezionando meno colonne da leggere (utilizzando il
parametro selected_fields
) o semplificando lo schema della tabella.
Passaggi successivi
- Ottieni informazioni sul rendimento delle query.
- Scopri di più su ottimizzare le query per migliorare il rendimento.
- Esamina le quote e i limiti per le query.
- Scopri di più su altri messaggi di errore di BigQuery.