Risolvere i problemi relativi alle query

Questo documento ha lo scopo di aiutarti a risolvere i problemi comuni relativi alle query in esecuzione, ad esempio identificando i motivi delle query lente o fornendo passaggi per la risoluzione degli errori comuni restituiti dalle query non riuscite.

Risolvere i problemi relativi alle query lente

Quando risolvi i problemi di lentezza delle prestazioni delle query, considera le seguenti cause comuni:

  1. Controlla la pagina Google Cloud Service Health per verificare la presenza di interruzioni note del servizio BigQuery che potrebbero influire sulle prestazioni delle query.

  2. Rivedi la sequenza temporale del job per la tua query nella pagina dei dettagli del job per vedere quanto tempo è stato 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 aiuto.

    • Se la maggior parte del tempo trascorso è dovuta a tempi di esecuzione lunghi, esamina gli insight sulle prestazioni delle query. Gli insight sulle prestazioni delle query possono informarti se la tua query è stata eseguita più a lungo del tempo di esecuzione medio e suggerire possibili cause. Le cause possibili potrebbero includere la contesa degli slot di query o una quota di shuffling insufficiente. Per ulteriori informazioni su ciascun problema di prestazioni delle query e sulle possibili risoluzioni, consulta Interpretare gli insight sulle prestazioni delle query.

  3. Esamina i byte elaborati nella pagina dei dettagli del job di query per vedere se è superiore al previsto. Puoi farlo confrontando il numero di byte elaborati dalla query attuale con un altro job di query completato in un periodo di tempo accettabile. Se c'è una grande discrepanza di byte elaborati tra le due query, forse la query era lenta a causa di un volume di dati elevato. Per informazioni sull'ottimizzazione delle query per gestire grandi volumi di dati, consulta Ottimizzare il calcolo delle query.

    Puoi anche identificare le query nel progetto che elaborano una grande quantità di dati cercando le query più costose utilizzando la vista INFORMATION_SCHEMA.JOBS.

Se ancora non riesci a trovare il motivo per spiegare prestazioni delle query più lente del previsto, contatta l'assistenza clienti Google Cloud per ricevere aiuto.

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 la mancata riuscita del job di importazione in un file casuale.

Per risolvere questo errore, assicurati che l'ultimo file alfabetico nel job di caricamento contenga il soprainsieme (unione) degli schemi diversi. Si tratta di un requisito basato sul 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 sono in esecuzione contemporaneamente in una sessione, opzione non supportata. Vedi i limiti della sessione.

Istruzioni DML in conflitto

Stringa di errore: Could not serialize access to table due to concurrent update

Questo errore può verificarsi quando si modificano le istruzioni DML (Data Manipulation Language) in esecuzione contemporaneamente sulla stessa tabella, entrano in conflitto tra loro o quando la tabella viene troncata durante un'istruzione DML mutante. Per ulteriori informazioni, consulta la sezione Conflitti tra istruzioni DML.

Per risolvere questo errore, esegui operazioni DML che interessano una singola tabella in modo che non si sovrappongano.

Autorizzazioni per 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 eseguire un'istruzione DML DELETE, UPDATE o MERGE, senza disporre dell'autorizzazione Lettore granulare sulle colonne analizzate che utilizzano il controllo dell'accesso a livello di colonna per limitare l'accesso a livello di colonna. Per maggiori informazioni, consulta 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 si eseguono query sui dati di Google Drive.

Per risolvere questo errore, aggiorna le credenziali della 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 essere visualizzato quando tenti di 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 della finestra di spostamento cronologico per il set di dati. Per risolvere questo errore, modifica la query in modo che acceda 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. Verifica se esiste una query o un'applicazione pianificata per l'esecuzione di questa operazione eseguita contemporaneamente alla query non riuscita. In caso affermativo, prova a spostare il processo che esegue l'operazione di rilascio e creazione in modo che venga eseguito in un momento che non sia in conflitto con le query che leggono 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, una 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 una chiamata a getQueryResults in cui non è specificato alcun valore per il campo location. In questo caso, prova a ripetere la chiamata e fornisci un valore location.

Per maggiori informazioni, consulta Evitare più valutazioni delle stesse espressioni tabella comuni (CTE).

La query supera il limite di tempo di esecuzione

Stringa di errore: Query fails due to reaching the execution time limit

Se la tua query sta raggiungendo il limite di tempo di esecuzione della query, controlla il tempo di esecuzione delle esecuzioni precedenti della query eseguendo una query sulla vista INFORMATION_SCHEMA.JOBS con una query simile all'esempio seguente:

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 gli insight sulle prestazioni delle query per determinare e risolvere il problema sottostante.

La risposta alla query è troppo grande

Stringa di errore: responseTooLarge

Questo errore si verifica quando i risultati della query superano la 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 nello stato PENDING in una coda per una singola tabella. In genere questo errore si verifica quando invii job DML per una singola tabella più velocemente di quanto sia in grado di elaborare BigQuery.

Una possibile soluzione è raggruppare più operazioni DML più piccole in job di dimensioni maggiori, ma meno. Se raggruppi i job più piccoli in job più grandi, il costo di esecuzione di questi job viene ammortizzato e l'esecuzione è più rapida. Il consolidamento delle istruzioni DML che interessano gli stessi dati in genere migliora l'efficienza dei job DML ed è meno probabile che superi il limite di quota per le dimensioni della coda. Per saperne di più sull'ottimizzazione delle operazioni DML, consulta Istruzioni DML che aggiornano o inseriscono singole righe.

Altre soluzioni per migliorare l'efficienza di DML potrebbero essere la partizione o il clustering delle 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 la esegui, a prescindere dalle tue autorizzazioni per il progetto che contiene i dati. Devi inoltre disporre dell'autorizzazione bigquery.tables.getData per tutte le tabelle e le viste a cui fa riferimento la query.

Questo errore può verificarsi anche se la tabella non esiste nella regione sottoposta a query, ad esempio asia-south1. Per eseguire query sulle viste, è necessaria questa autorizzazione anche per tutte le tabelle e le viste sottostanti. Per maggiori informazioni sulle autorizzazioni richieste, consulta Eseguire una query.

Per risolvere questo errore, considera quanto segue:

  • Account di servizio: gli account di servizio devono disporre dell'autorizzazione bigquery.jobs.create nel progetto da cui vengono eseguiti.

  • Ruoli personalizzati: i ruoli IAM personalizzati devono avere l'autorizzazione bigquery.jobs.create esplicitamente inclusa nel ruolo pertinente.

  • Set di dati condivisi: quando lavori con set di dati condivisi in un progetto separato, potresti comunque avere bisogno dell'autorizzazione bigquery.jobs.create nel progetto per eseguire query o job nel set di dati.

Per concedere l'autorizzazione ad accedere alla tabella

Per concedere l'autorizzazione ad accedere 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 e fai clic su Gestisci autorizzazioni.

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

  4. In Assegna ruoli, seleziona l'autorizzazione bigquery.jobs.create. In alternativa, la concessione del ruolo roles/bigquery.jobUser nel progetto da cui viene eseguita la query fornisce 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 alla quantità di dati analizzati. Per informazioni su come risolvere questi problemi, consulta Risolvere i problemi relativi al superamento delle risorse.

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 istruzioni SELECT, questo errore si verifica quando la query utilizza troppe risorse. Per risolvere questo errore, vedi Risolvere i problemi relativi al superamento delle risorse.

La query supera le risorse di shuffling

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 risolvere questo errore, esegui il provisioning di più slot o riduci la quantità di dati elaborati dalla query. Per ulteriori informazioni su come eseguire questa operazione, consulta Quota di shuffle insufficiente.

Per ulteriori informazioni su come risolvere questi problemi, consulta Risolvere i problemi relativi al superamento delle risorse.

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 della complessità sono:

  • WITH clausole che sono molto nidificate o utilizzate ripetutamente.
  • Visualizzazioni nidificate o utilizzate più volte.
  • Utilizzo ripetuto dell'operatore UNION ALL.

Per risolvere questo errore, prova le seguenti opzioni:

  • Suddividi la query in più query, quindi utilizza il linguaggio procedurale per eseguire le 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 vista INFORMATION_SCHEMA.JOBS. L'esempio seguente restituisce le query con un elevato utilizzo delle risorse negli 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, consulta 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 seguire questi passaggi:

  • Prova a rimuovere una clausola ORDER BY.
  • Se la query utilizza JOIN, assicurati che la tabella più grande si trovi sul lato sinistro della clausola.
  • Se la query utilizza FLATTEN, determina se è necessario per il tuo caso d'uso. Per ulteriori informazioni, consulta l'articolo Dati nidificati e ripetuti.
  • Se la 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 usare 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 una sottoselezione.
  • 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(), oppure rimuovere completamente la clausola LIMIT per consentire la parallelizzazione in scrittura.
  • Se la query ha utilizzato viste molto nidificate e una clausola WITH, ciò può causare una crescita esponenziale della complessità, raggiungendo così i limiti.
  • Non sostituire le tabelle temporanee con le clausole WITH. La clausola potrebbe dover essere ricalcolata più volte, il che può rendere la query complessa e di conseguenza lenta. La presenza di risultati intermedi persistenti in tabelle temporanee aiuta invece a complessità
  • Evita di utilizzare query UNION ALL.

Per maggiori informazioni, consulta le seguenti risorse:

Per i job di caricamento:

Se stai caricando file Avro o Parquet, riduci le dimensioni delle righe nei file. Verifica eventuali limitazioni di dimensioni specifiche per il formato di 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 all'API Storage Read, alcuni flussi con utilizzo elevato di memoria potrebbero ricevere un errore RESOURCE_EXHAUSTED con questo messaggio. Questo può accadere quando si leggono da tabelle larghe o da tabelle con uno schema complesso. Come soluzione, riduci le dimensioni delle righe dei risultati selezionando meno colonne da leggere (utilizzando il parametro selected_fields) o semplificando lo schema della tabella.

Passaggi successivi