Ottimizzare i job di caricamento

Le strategie e le best practice descritte in questo documento ti aiutano a ottimizzare il caricamento batch o lo streaming di dati in BigQuery per evitare di raggiungere il limite per il numero di job di caricamento per tabella al giorno.

Poiché il limite per i job di caricamento è fisso e non può essere aumentato, devi ottimizzare i job di caricamento strutturando le tabelle tramite metodi come le partizioni di tabella o gestendo i caricamenti tramite metodi come il caricamento batch o lo streaming.

Come funzionano le quote per le operazioni sulle tabelle

Il limite BigQuery per le modifiche alle tabelle per tabella al giorno per progetto è fisso, indipendentemente dal fatto che le modifiche aggiungano o aggiornino i dati o tronchino la tabella. Questo limite include il totale combinato di tutti i job di caricamento, i job di copia e i job di query che aggiungono dati a una tabella di destinazione o la sovrascrivono.

I job di caricamento hanno una velocità di ricarica. Se superi il limite di operazioni sulla tabella o la relativa frequenza di ricarica, i job di caricamento non vanno a buon fine e viene visualizzato un errore quotaExceeded. Il limite a livello di progetto per i job di caricamento al giorno viene reintegrato entro un periodo di 24 ore. Al termine dei job di caricamento, la quota disponibile diminuisce. La quota viene poi ricaricata gradualmente nelle 24 ore successive. I job di caricamento non riusciti vengono comunque conteggiati ai fini delle quote per tabella e per progetto. Per saperne di più sui limiti dei job di caricamento, consulta Job di caricamento.

Per le tabelle partizionate, si applica un limite separato per le tabella partizionata partizionate, che sostituisce il limite standard per le tabelle.

Per rispettare i limiti giornalieri delle operazioni sulle tabelle, distribuisci le operazioni su un periodo di 24 ore. Ad esempio, se esegui 25 aggiornamenti, ognuno con 60 operazioni, puoi eseguire circa 60 operazioni ogni 58 minuti. Questo approccio ti aiuta a rispettare il limite giornaliero. Per monitorare gli aggiornamenti delle tabelle, consulta le viste INFORMATION_SCHEMA BigQuery.

Operazioni sulle tabelle escluse dalla quota

L'aggiornamento delle informazioni della tabella (metadati) e l'utilizzo delle istruzioni DML non vengono conteggiati ai fini del limite giornaliero di modifiche alla tabella. Questa esclusione si applica sia alle tabelle standard sia a quelle partizionate.

Il tuo progetto può eseguire un numero illimitato di istruzioni DML. Mentre le istruzioni DML venivano conteggiate in precedenza per le modifiche giornaliere alle tabelle e non venivano limitate anche al limite, ora non più.

Anche gli inserti di streaming modificano le tabelle, ma sono regolati da quote specifiche.

Caricare le strategie per evitare il limite delle operazioni sulla tabella

Per rispettare il limite giornaliero di operazioni su tabella di BigQuery, valuta queste best practice:

  • Esegui un numero inferiore di scritture più grandi anziché molte scritture piccole.
  • Ridurre al minimo i job di scrittura separati nella tabella di produzione finale ogni giorno.

Per utilizzare queste best practice, esegui il batch o lo streaming dei dati in BigQuery. La scelta del metodo di caricamento dipende dal fatto che tu debba caricare volumi elevati di dati in tempo reale o se il caricamento in tempo reale non è un problema. Le sezioni seguenti spiegano in dettaglio il caricamento batch e lo streaming dei dati, inclusi gli strumenti e i servizi che puoi utilizzare per ciascun metodo.

Caricamento in batch

Per rispettare il limite di caricamento giornaliero per progetto per BigQuery, raggruppa grandi quantità di dati e caricali con meno job in BigQuery. Le sezioni seguenti descrivono diversi metodi che puoi utilizzare per caricare i dati in batch.

Caricare più dati per ogni job

Anziché inviare dati a BigQuery ogni volta che sono disponibili nuove informazioni, raccoglili e caricali in BigQuery utilizzando un unico job di grandi dimensioni.

Ad esempio, anziché eseguire un job di caricamento separato per ogni poche righe di dati, puoi attendere di accumulare diverse migliaia di righe di dati in un file, ad esempio in un file CSV o JSON, e poi eseguire un job di caricamento per aggiungere tutti i dati a una tabella. Questa azione viene conteggiata come un'operazione sulla tabella, anche se il job contiene molti più dati. Puoi raggruppare i file utilizzando i caratteri jolly con il job di caricamento. I caratteri jolly ti consentono di selezionare batch di file in una directory per caricare più file in un unico job di caricamento.

L'esempio seguente mostra come utilizzare i caratteri jolly con il comando bq load o con le query SQL LOAD DATA.

bq

L'esempio seguente mostra un comando bq load per caricare i dati CSV da Cloud Storage in una tabella BigQuery denominata my_target_table. Per selezionare più nomi di file di origine, utilizza un carattere jolly con il comando. Il flag AUTODETECT determina automaticamente lo schema della tabella dai dati di origine in Cloud Storage e può supportare un carattere jolly (*) per caricare più file che corrispondono a un pattern di denominazione specifico nella tabella BigQuery.

bq load \
  --source_format=CSV \
  --autodetect \
  --project_id=PROJECT_ID \
  DATASET_NAME.TABLE_NAME \
  "gs://BUCKET_NAME/OBJECT_PATH_WILDCARD"

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del tuo Google Cloud progetto.
  • DATASET_NAME: il nome del set di dati BigQuery in cui vuoi caricare i dati.
  • TABLE_NAME: il nome della tabella BigQuery in cui vuoi caricare i dati.
  • BUCKET_NAME: il nome del bucket Cloud Storage che contiene i file di origine.
  • OBJECT_PATH_WILDCARD: il percorso dei file CSV nel bucket Cloud Storage. Includi un carattere jolly (*) per trovare la corrispondenza con più file. Ad esempio, la stringa gs://my-bucket/path/to/data/my_prefix_*.csv utilizza il carattere jolly * per caricare tutti i file in gs://my-bucket/path/to/data/ che iniziano con my_prefix_ e terminano con .csv.

Per ulteriori informazioni, consulta le seguenti risorse:

SQL

L'esempio seguente mostra come utilizzare la query SQL LOAD DATA per caricare i dati CSV da un bucket Cloud Storage in una tabella BigQuery. Per selezionare più nomi file di origine, utilizza un carattere jolly con il comando.

LOAD DATA INTO
DATASET_NAME.TABLE_NAME
FROM FILES (
  format = 'SOURCE_FORMAT',
  uris = ['gs://BUCKET_NAME/OBJECT_PATH_WILDCARD]
  );

Sostituisci quanto segue:

  • DATASET_NAME: il nome del set di dati BigQuery in cui vuoi caricare i dati.
  • TABLE_NAME: il nome della tabella BigQuery in cui vuoi caricare i dati.
  • SOURCE_FORMAT imposta il tipo di file di origine, ad esempio CSV o JSON. In questo esempio, utilizza CSV.
  • BUCKET_NAME: il nome del bucket Cloud Storage che contiene i file di origine.
  • OBJECT_PATH_WILDCARD: il percorso dei file CSV nel bucket Cloud Storage. Includi un carattere jolly (*) per trovare la corrispondenza con più file. Ad esempio, la stringa gs://my-bucket/path/to/data/my_prefix_*.csv utilizza il carattere jolly * per caricare tutti i file in gs://my-bucket/path/to/data/ che iniziano con my_prefix_ e terminano con .csv.

Per saperne di più, consulta Istruzioni di caricamento in GoogleSQL.

Caricamento batch utilizzando l'API BigQuery Storage Write

Per caricare i dati batch in BigQuery, un'opzione è utilizzare l'API Storage Write direttamente dalla tua applicazione con le librerie client delle API di Google.

L'API Storage Write ottimizza il caricamento dei dati per rispettare i limiti della tabella. Per lo streaming in tempo reale ad alto volume, utilizza uno stream PENDING anziché uno stream COMMITTED. Quando utilizzi un flusso PENDING, l'API memorizza temporaneamente i record finché non esegui il commit del flusso.

Per un esempio completo di caricamento batch dei dati utilizzando l'API Storage Write, consulta Caricare i dati in batch utilizzando l'API Storage Write.

Caricamento batch utilizzando Dataflow

Se vuoi trasmettere, trasformare e scrivere dati in BigQuery utilizzando pipeline di dati, puoi utilizzare Dataflow. Le pipeline di dati che crei leggono da origini supportate come Pub/Sub o Apache Kafka. Puoi anche creare una pipeline Dataflow utilizzando il connettore BigQueryIO, che utilizza l'API Storage Write per lo streaming di dati ad alte prestazioni e la semantica exactly-once.

Per informazioni sull'utilizzo di Dataflow per il caricamento batch dei dati in BigQuery, consulta Scrittura da Dataflow a BigQuery.

Streaming di dati

Per caricare grandi volumi di dati con aggiornamenti frequenti, ti consigliamo di trasmettere in streaming i dati in BigQuery. Con lo streaming dei dati, i nuovi dati vengono scritti continuamente dall'applicazione client in BigQuery, una strategia che evita di raggiungere il limite per l'esecuzione di troppi job di caricamento. Le sezioni seguenti descrivono diversi metodi per trasmettere i dati in streaming in BigQuery.

Trasmettere dati in streaming utilizzando l'API Storage Write

Utilizza l'API Storage Write per trasmettere in streaming i record in tempo reale in BigQuery con una latenza minima. L'API Storage Write fornisce un protocollo di streaming efficiente che offre funzionalità avanzate come la semantica di distribuzione esatta, il rilevamento degli aggiornamenti dello schema e gli upsert Change Data Capture (CDC) di streaming. Inoltre, puoi importare fino a 2 TiB al mese senza costi.

Per informazioni sull'utilizzo dell'API Storage Write, vedi Streaming di dati utilizzando l'API Storage Write.

Trasmettere dati in streaming utilizzando Dataflow

Utilizza Dataflow per creare pipeline di dati che leggono da origini supportate, ad esempio Pub/Sub o Apache Kafka. Queste pipeline trasformano e scrivono i dati in BigQuery come destinazione. Puoi creare una pipeline Dataflow utilizzando il connettore BigQueryIO, che utilizza l'API Storage Write.

Per informazioni sull'utilizzo di Dataflow per trasmettere dati in streaming a BigQuery, consulta Scrittura da Dataflow a BigQuery.

Best practice per la gestione delle tabelle per il caricamento

Oltre a caricare in batch o trasmettere in streaming i dati in BigQuery, gestisci le tabelle nei seguenti modi per ottimizzarle per l'importazione dati.

Usa tabelle partizionate

Il partizionamento delle tabelle è una tecnica efficace per gestire tabelle di grandi dimensioni in BigQuery, soprattutto quando devi eseguire frequenti operazioni di caricamento dei dati. Puoi migliorare significativamente le prestazioni e la redditività della tabella dividendo una tabella in segmenti più piccoli e più gestibili in base a una data, un timestamp o un numero intero.

Il vantaggio principale del partizionamento per il caricamento dei dati è che le quote operative giornaliere delle tabelle per BigQuery si applicano a livello di partizione anziché a livello di tabella. Per le tabelle partizionate, si applica un limite separato e più elevato alle modifiche alle partizioni, che sostituisce il limite delle tabelle standard. Il limite per le tabelle partizionate aumenta notevolmente il numero di job di caricamento che puoi eseguire al giorno senza raggiungere i limiti di quota.

Una strategia comune e molto efficace è il caricamento batch dei dati giornalieri. Ad esempio, puoi raccogliere tutti i dati del giorno per 2025-09-18 in una tabella di staging temporanea. Poi, alla fine della giornata, esegui un singolo job per caricare questi dati nella partizione specifica per questo giorno nella tabella di produzione principale. Poiché BigQuery interagisce solo con i dati di una singola partizione, questo approccio mantiene i dati ben organizzati e rende le operazioni di caricamento più veloci ed economiche.

Sebbene il partizionamento sia vivamente consigliato per le tabelle di grandi dimensioni in crescita, è meglio evitarlo se le partizioni sono costantemente inferiori a 10 GB. Per saperne di più, consulta Quando utilizzare il partizionamento.

Per scoprire di più sui diversi metodi di partizionamento disponibili, come il partizionamento per unità di tempo e per intervallo di numeri interi, consulta Tipi di tabelle partizionate.

Sfrutta il backoff esponenziale, il troncamento e il jitter integrati

Il backoff esponenziale e i nuovi tentativi integrati sono un metodo di gestione degli errori che aiuta l'applicazione a ripristinarsi senza problemi quando un'operazione non riesce temporaneamente. Questi errori possono includere un errore di limite di frequenza (rateLimitExceeded) o un breve problema di rete (unavailable).

In un sistema affidabile, i worker che prelevano le attività dalla coda lato client utilizzano anche il backoff esponenziale e i nuovi tentativi. Lo fanno quando chiamano BigQuery, il che crea due livelli di protezione.

Ad esempio, la libreria google-cloud-bigquery-storage ufficiale per Python include una logica di ripetizione integrata con backoff esponenziale. Questa logica gestisce gli errori gRPC temporanei, ad esempio UNAVAILABLE. Nella maggior parte dei casi, non è necessario scrivere personalmente questo codice di riprova. La chiamata client.append_rows() gestisce automaticamente questi tentativi.

Questa gestione integrata è un vantaggio significativo dell'utilizzo delle librerie client ufficiali. Devi occuparti solo degli errori per cui non è possibile riprovare, ad esempio INVALID_ARGUMENT, che indica una mancata corrispondenza dello schema.