Introduzione alle tabelle partizionate

Una tabella partizionata è divisa in segmenti, denominati partizioni, che semplificano la gestione e l'esecuzione di query sui dati. Dividendo una tabella grande in partizioni più piccole puoi migliorare le prestazioni delle query e controllare i costi riducendo il numero di byte letti da una query. Le tabelle vengono partizionate specificando una colonna di partizione utilizzata per segmentare la tabella.

Se una query utilizza un filtro idoneo sul valore della colonna di partizionamento, BigQuery può analizzare le partizioni che corrispondono al filtro e saltare quelle rimanenti. Questo processo è detto "eliminazione delle partizioni".

In una tabella partizionata, i dati vengono archiviati in blocchi fisici, ognuno dei quali contiene una partizione di dati. Ogni tabella partizionata mantiene vari metadati sulle proprietà di ordinamento in tutte le operazioni che la modificano. I metadati consentono a BigQuery di stimare con maggiore precisione il costo di una query prima che venga eseguita.

Quando utilizzare il partizionamento

Prendi in considerazione il partizionamento di una tabella nei seguenti scenari:

  • Vuoi migliorare le prestazioni delle query analizzando solo una parte di una tabella.
  • L'operazione sulla tabella supera una quota di tabella standard e puoi limitare le operazioni sulla tabella a valori specifici della colonna di partizione, consentendo quote di tabella partizionata più elevate.
  • Vuoi determinare i costi delle query prima che vengano eseguite. BigQuery fornisce stime dei costi delle query prima che vengano eseguite su una tabella partizionata. Calcola una stima dei costi delle query eliminando una tabella partizionata, quindi esegui una prova dry run della query per stimare i costi delle query.
  • Vuoi utilizzare una delle seguenti funzionalità di gestione a livello di partizione:

Prendi in considerazione il clustering di una tabella anziché il partizionamento di una tabella nelle seguenti circostanze:

  • Hai bisogno di una granularità maggiore di quella consentita dal partizionamento.
  • Le query utilizzano comunemente filtri o aggregazioni su più colonne.
  • La cardinalità del numero di valori in una colonna o in un gruppo di colonne è elevata.
  • Non hai bisogno di stime dei costi precise prima dell'esecuzione delle query.
  • Il partizionamento genera una piccola quantità di dati per partizione (circa meno di 10 GB). La creazione di molte piccole partizioni aumenta i metadati della tabella e può influire sui tempi di accesso ai metadati durante l'esecuzione di query sulla tabella.
  • Il partizionamento genera un numero elevato di partizioni, superando i limiti delle tabelle partizionate.
  • Le operazioni DML modificano spesso (ad esempio, ogni pochi minuti) la maggior parte delle partizioni della tabella.

In questi casi, il clustering delle tabelle consente di velocizzare le query raggruppando i dati in colonne specifiche in base alle proprietà di ordinamento definite dall'utente.

Puoi anche combinare il clustering e il partizionamento delle tabelle per ottenere un ordinamento più granulare. Per ulteriori informazioni su questo approccio, consulta Combinare tabelle in cluster e partizionate.

Tipi di partizionamento

Questa sezione descrive i diversi modi per partizionare una tabella.

Partizionamento per intervalli di numeri interi

Puoi partizionare una tabella in base agli intervalli di valori in una colonna INTEGER specifica. Per creare una tabella partizionata per intervalli di numeri interi, devi fornire:

  • La colonna di partizionamento.
  • Il valore iniziale per il partizionamento degli intervalli (inclusivo).
  • Il valore finale per il partizionamento degli intervalli (esclusivo).
  • L'intervallo di ogni intervallo all'interno della partizione.

Supponiamo, ad esempio, di creare una partizione per intervalli di numeri interi con la seguente specifica:

Argomento Valore
nome colonna customer_id
start 0
end 100
intervallo 10

La tabella è partizionata in base alla colonna customer_id in intervalli di 10. I valori da 0 a 9 vanno in una partizione, i valori da 10 a 19 vanno nella partizione successiva e così via, fino a 99. I valori al di fuori di questo intervallo vanno in una partizione denominata __UNPARTITIONED__. Tutte le righe in cui customer_id è NULL vanno in una partizione denominata __NULL__.

Per informazioni sulle tabelle partizionate per intervalli di numeri interi, consulta Creare una tabella partizionata per intervalli di numeri interi.

Partizionamento per colonne di unità di tempo

Puoi partizionare una tabella in base a una colonna DATE,TIMESTAMP o DATETIME della tabella. Quando scrivi dati nella tabella, BigQuery li inserisce automaticamente nella partizione corretta, in base ai valori della colonna.

Per le colonne TIMESTAMP e DATETIME, le partizioni possono avere una granularità oraria, giornaliera, mensile o annuale. Per le colonne DATE, le partizioni possono avere una granularità giornaliera, mensile o annuale. I limiti delle partizioni si basano sull'ora UTC.

Supponiamo, ad esempio, di partizionare una tabella in base a una colonna DATETIME con partizionamento mensile. Se inserisci i seguenti valori nella tabella, le righe vengono scritte nelle seguenti partizioni:

Valore colonna Partizione (mensile)
DATETIME("2019-01-01") 201901
DATETIME("2019-01-15") 201901
DATETIME("2019-04-30") 201904

Inoltre, vengono create due partizioni speciali:

  • __NULL__: contiene le righe con valori NULL nella colonna di partizionamento.
  • __UNPARTITIONED__: contiene le righe in cui il valore della colonna di partizionamento è precedente al 01/01/1960 o successivo al 31/12/2159.

Per informazioni sulle tabelle partizionate per colonne di unità di tempo, consulta Creare una tabella partizionata per colonne di unità di tempo.

Partizionamento per data di importazione

Quando crei una tabella partizionata per data di importazione, BigQuery assegna automaticamente le righe alle partizioni in base all'ora in cui BigQuery importa i dati. Puoi scegliere una granularità oraria, giornaliera, mensile o annuale per le partizioni. I limiti delle partizioni si basano sull'ora UTC.

Se i dati potrebbero raggiungere il numero massimo di partizioni per tabella quando utilizzi una granularità temporale più precisa, utilizza una granularità più grossolana. Ad esempio, puoi partizionare per mese anziché per giorno per ridurre il numero di partizioni. Puoi anche raggruppare in cluster la colonna di partizione per migliorare ulteriormente le prestazioni.

Una tabella partizionata per data di importazione ha una pseudo-colonna denominata _PARTITIONTIME. Il valore di questa colonna è l'ora di importazione di ogni riga, troncata al limite della partizione (ad esempio orario o giornaliero). Supponiamo, ad esempio, di creare una tabella partizionata per data di importazione con partizionamento orario e di inviare i dati nei seguenti orari:

Data/ora importazione _PARTITIONTIME Partizione (oraria)
2021-05-07 17:22:00 2021-05-07 17:00:00 2021050717
2021-05-07 17:40:00 2021-05-07 17:00:00 2021050717
2021-05-07 18:31:00 2021-05-07 18:00:00 2021050718

Poiché la tabella in questo esempio utilizza il partizionamento orario, il valore di _PARTITIONTIME viene troncato al limite orario. BigQuery utilizza questo valore per determinare la partizione corretta per i dati.

Puoi anche scrivere dati in una partizione specifica. Ad esempio, potresti voler caricare dati storici o modificare i fusi orari. Puoi utilizzare qualsiasi data valida compresa tra il 01/01/0001 e il 31/12/9999. Tuttavia, le istruzioni DML non possono fare riferimento a date precedenti al 01/01/1970 o successive al 31/12/2159. Per ulteriori informazioni, consulta Scrivere dati in una partizione specifica.

Invece di utilizzare _PARTITIONTIME, puoi anche utilizzare _PARTITIONDATE. La pseudo-colonna _PARTITIONDATE contiene la data UTC corrispondente al valore della pseudo-colonna _PARTITIONTIME.

Selezionare il partizionamento giornaliero, orario, mensile o annuale

Quando partizioni una tabella in base alla colonna di unità di tempo o alla data di importazione, scegli se le partizioni devono avere una granularità giornaliera, oraria, mensile o annuale.

  • Il partizionamento giornaliero è il tipo di partizionamento predefinito. Il partizionamento giornaliero è una buona scelta quando i dati sono distribuiti su un ampio intervallo di date o se i dati vengono aggiunti continuamente nel tempo.

  • Scegli il partizionamento orario se le tabelle hanno un volume elevato di dati che copre un intervallo di date breve, in genere meno di sei mesi di valori di timestamp. Se scegli il partizionamento orario, assicurati che il numero di partizioni rimanga entro i limiti delle partizioni.

  • Scegli il partizionamento mensile o annuale se le tabelle hanno una quantità di dati relativamente piccola per ogni giorno, ma coprono un ampio intervallo di date. Questa opzione è consigliata anche se il flusso di lavoro richiede l'aggiornamento o l'aggiunta frequente di righe che coprono un ampio intervallo di date (ad esempio, più di 500 date). In questi scenari, utilizza il partizionamento mensile o annuale insieme al clustering sulla colonna di partizionamento per ottenere le migliori prestazioni. Per ulteriori informazioni, consulta Combinare tabelle in cluster e partizionate in questo documento.

Combinare tabelle in cluster e partizionate

Puoi combinare il partizionamento delle tabelle con il clustering delle tabelle per ottenere un ordinamento granulare per un'ulteriore ottimizzazione delle query.

Una tabella in cluster contiene colonne in cluster che ordinano i dati in base alle proprietà di ordinamento definite dall'utente. I dati all'interno di queste colonne in cluster vengono ordinati in blocchi di archiviazione di dimensioni adattive in base alle dimensioni della tabella. Quando esegui una query che filtra in base alla colonna in cluster, BigQuery analizza solo i blocchi pertinenti in base alle colonne in cluster anziché l'intera tabella o la partizione della tabella. In un approccio combinato che utilizza sia il partizionamento delle tabelle sia il clustering, devi prima segmentare i dati delle tabelle in partizioni, quindi raggruppare in cluster i dati all'interno di ogni partizione in base alle colonne in cluster.

Quando crei una tabella in cluster e partizionata, puoi ottenere un ordinamento più granulare, come mostrato nel seguente diagramma:

Confronto tra tabelle non in cluster o partizionate e tabelle in cluster e partizionate.

Partizionamento e sharding

Lo sharding delle tabelle è la pratica di archiviare i dati in più tabelle, utilizzando un prefisso di denominazione come [PREFIX]_YYYYMMDD.

Il partizionamento è consigliato rispetto allo sharding delle tabelle, perché le tabelle partizionate hanno prestazioni migliori. Con le tabelle con sharding, BigQuery deve mantenere una copia dello schema e dei metadati per ogni tabella. BigQuery potrebbe anche dover verificare le autorizzazioni per ogni tabella su cui viene eseguita una query. Questa pratica aumenta anche l'overhead delle query e influisce sulle prestazioni delle query.

Se in precedenza hai creato tabelle con sharding per data, puoi convertirle in una tabella partizionata per data di importazione. Per ulteriori informazioni, consulta Convertire le tabelle con sharding per data in tabelle partizionate per data di importazione.

Decorator per partizioni

I decorator per partizioni consentono di fare riferimento a una partizione in una tabella. Ad esempio, puoi utilizzarli per scrivere dati in una partizione specifica.

Un decorator per partizioni ha il formato table_name$partition_id, dove il formato del segmento partition_id dipende dal tipo di partizionamento:

Tipo di partizionamento Formato Esempio
Ogni ora yyyymmddhh my_table$2021071205
Ogni giorno yyyymmdd my_table$20210712
Mensile yyyymm my_table$202107
Annuale yyyy my_table$2021
Intervallo di numeri interi range_start my_table$40

Sfogliare i dati in una partizione

Per sfogliare i dati in una partizione specificata, utilizza il bq head comando con un decorator per partizioni.

Ad esempio, il seguente comando elenca tutti i campi nelle prime 10 righe di my_dataset.my_table nella partizione 2018-02-24:

    bq head --max_rows=10 'my_dataset.my_table$20180224'

Esportare i dati delle tabelle

L'esportazione di tutti i dati da una tabella partizionata è la stessa procedura di esportazione dei dati da una tabella non partizionata. Per ulteriori informazioni, consulta Esportare i dati delle tabelle.

Per esportare i dati da una singola partizione, utilizza il comando bq extract e aggiungi il decorator per partizioni al nome della tabella. Ad esempio, my_table$20160201. Puoi anche esportare i dati dalle partizioni __NULL__ e __UNPARTITIONED__ aggiungendo i nomi delle partizioni al nome della tabella. Ad esempio, my_table$__NULL__ o my_table$__UNPARTITIONED__.

Limitazioni

Le tabelle partizionate presentano le seguenti limitazioni:

  • Non puoi utilizzare SQL precedente per eseguire query sulle tabelle partizionate o per scrivere i risultati delle query nelle tabelle partizionate.

  • BigQuery non supporta il partizionamento per più colonne. È possibile utilizzare una sola colonna per partizionare una tabella.

  • Non puoi convertire direttamente una tabella non partizionata esistente in una tabella partizionata. La strategia di partizionamento viene definita al momento della creazione della tabella. Utilizza invece l'CREATE TABLE istruzione per creare una nuova tabella partizionata eseguendo query sui dati nella tabella esistente.

  • Le tabelle partizionate per colonne di unità di tempo sono soggette alle seguenti limitazioni:

    • La colonna di partizionamento deve essere una colonna scalare DATE, TIMESTAMP o DATETIME. Sebbene la modalità della colonna possa essere REQUIRED o NULLABLE, non può essere REPEATED (basata su array).
    • La colonna di partizionamento deve essere un campo di primo livello. Non puoi utilizzare un campo foglia di un RECORD (STRUCT) come colonna di partizionamento.

    Per informazioni sulle tabelle partizionate per colonne di unità di tempo, consulta Creare una tabella partizionata per colonne di unità di tempo.

  • Le tabelle partizionate per intervalli di numeri interi sono soggette alle seguenti limitazioni:

    • La colonna di partizionamento deve essere una colonna INTEGER. Sebbene la modalità della colonna possa essere REQUIRED o NULLABLE, non può essere REPEATED (basata su array).
    • La colonna di partizionamento deve essere un campo di primo livello. Non puoi utilizzare un campo foglia di un RECORD (STRUCT) come colonna di partizionamento.

    Per informazioni sulle tabelle partizionate per intervalli di numeri interi, consulta Creare una tabella partizionata per intervalli di numeri interi.

Quote e limiti

Le tabelle partizionate hanno limiti definiti in BigQuery. Per ulteriori informazioni su tutte le quote e i limiti, consulta Quote e limiti.

Quote e limiti per i job sulle tabelle partizionate

Le quote e i limiti si applicano anche ai diversi tipi di job che puoi eseguire sulle tabelle partizionate, tra cui:

Errori di quota relativi al numero di modifiche delle partizioni per le tabelle partizionate per colonne

BigQuery restituisce questo errore quando la tabella partizionata per colonne raggiunge la quota del numero di modifiche delle partizioni consentite al giorno. Le modifiche delle partizioni includono il totale di tutti i job di caricamento, job di copia e job di query che aggiungono o sovrascrivono una partizione di destinazione.

Per visualizzare il valore del limite Numero di modifiche delle partizioni per tabella partizionata per colonne al giorno, consulta Tabelle partizionate.

Messaggio di errore

Quota exceeded: Your table exceeded quota for
Number of partition modifications to a column partitioned table

Risoluzione

Questa quota non può essere aumentata. Per risolvere questo errore di quota:

  • Modifica il partizionamento della tabella in modo che ogni partizione contenga più dati, in modo da ridurre il numero totale di partizioni. Ad esempio, passa dal partizionamento per giorno al partizionamento per mese o modifica il modo in cui partizioni la tabella.
  • Utilizza il clustering anziché il partizionamento.
  • Se carichi spesso dati da più file di piccole dimensioni archiviati in Cloud Storage che utilizzano un job per file, combina più job di caricamento in un unico job. Puoi caricare da più URI di Cloud Storage con un elenco separato da virgole (ad esempio, gs://my_path/file_1,gs://my_path/file_2) o utilizzando i caratteri jolly (ad esempio, gs://my_path/*).

    Per ulteriori informazioni, consulta Caricare dati in batch.

  • Se utilizzi i job di caricamento, selezione o copia per aggiungere singole righe di dati a una tabella, ad esempio, devi prendere in considerazione la possibilità di raggruppare più job in un unico job. BigQuery non funziona bene se utilizzato come database relazionale. Come best practice, evita di eseguire azioni di aggiunta di singole righe frequenti.
  • Per aggiungere dati a una velocità elevata, valuta la possibilità di utilizzare l'API BigQuery Storage Write (gRPC). È una soluzione consigliata per importazione dati ad alte prestazioni. L'API BigQuery Storage Write (gRPC) offre funzionalità robuste, tra cui la semantica di consegna exactly-once. Per scoprire di più su limiti e quote, consulta API Storage Write e per visualizzare i costi di utilizzo di questa API, consulta Prezzi di importazione dati BigQuery.
  • Per monitorare il numero di partizioni modificate in una tabella, utilizza la INFORMATION_SCHEMA vista.
  • Per informazioni sull'ottimizzazione dei job di caricamento delle tabelle per evitare di raggiungere i limiti di quota, consulta Ottimizzare i job di caricamento.

Prezzi delle tabelle

Quando crei e utilizzi tabelle partizionate in BigQuery, i tuoi addebiti dipendono dalla quantità di dati archiviati nelle partizioni e dalle query eseguite sui dati:

Molte operazioni tabella partizionata sono senza costi, tra cui il caricamento dei dati nelle partizioni, la copia delle partizioni e l'esportazione dei dati dalle partizioni. Sebbene siano senza costi, queste operazioni sono soggette a quote e limiti di BigQuery. Per informazioni su tutte le operazioni senza costi, consulta Operazioni senza costi nella pagina dei prezzi.

Per le best practice per il controllo dei costi in BigQuery, consulta Controllare i costi in BigQuery.

Sicurezza delle tabelle

Il controllo dell'accesso per le tabelle partizionate è lo stesso delle tabelle standard. Per ulteriori informazioni, consulta Introduzione ai controlli dell'accesso alle tabelle.

Passaggi successivi