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:

  1. Controlla lo stato di Google Cloud Service Health pagina per le interruzioni note del servizio BigQuery che potrebbero influire sulle query delle prestazioni.

  2. 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.

  3. 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 o IN 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:

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:

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'autorizzazionebigquery.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:

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. In Explorer, vai alla tabella a cui vuoi accedere, seleziona Visualizza azioni, seleziona Condividi, quindi fai clic su Gestisci autorizzazioni.

  3. In Aggiungi entità, inserisci il nome degli utenti, dei gruppi, dei domini che vuoi aggiungere.

  4. In Assegna ruoli, seleziona l'autorizzazione bigquery.jobs.create. In alternativa, puoi concedere il ruolo roles/bigquery.jobUser nel progetto da cui viene eseguita la query per ottenere le autorizzazioni necessarie.

  5. 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 usare COUNT(DISTINCT).
  • Se la query utilizza COUNT(DISTINCT <value>, <n>) con un valore <n> elevato, valuta la possibilità di utilizzare GROUP BY. Per ulteriori informazioni, vedi COUNT(DISTINCT).
  • Se la query utilizza UNIQUE, valuta la possibilità di utilizzare GROUP 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 esempio ROW_NUMBER(), o rimuovendo completamente la clausola LIMIT 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:

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