Esecuzione di query sulle tabelle in cluster
Quando crei una tabella in cluster in BigQuery, i dati della tabella vengono organizzati automaticamente in base ai contenuti di una o più colonne nello schema della tabella. Le colonne specificate vengono utilizzate per collocare vicini i dati correlati. Quando raggruppi una tabella usando più colonne, l'ordine delle colonne specificate è importante. L'ordine delle colonne specificate determina l'ordinamento dei dati.
Per ottimizzare le prestazioni quando esegui query sulle tabelle in cluster, utilizza un'espressione che filtra in base a una colonna in cluster o a più colonne in cluster nell'ordine in cui sono specificate. Le query che filtrano in base alle colonne in cluster hanno in genere un rendimento migliore rispetto alle query che filtrano solo in base alle colonne non in cluster.
BigQuery ordina i dati in una tabella in cluster in base ai valori nelle colonne di clustering e li organizza in blocchi.
Quando invii una query che contiene un filtro su una colonna in cluster, BigQuery utilizza le informazioni di clustering per determinare in modo efficiente se un blocco contiene dati pertinenti per la query. Ciò consente a BigQuery di eseguire la scansione solo dei blocchi pertinenti, una procedura denominata eliminazione dei blocchi.
Puoi eseguire query sulle tabelle in cluster in base a:
- Utilizzo della console Google Cloud
- Utilizzo del comando
bq query
dello strumento a riga di comando bq - Chiamata al metodo
jobs.insert
e configurazione di un job di query - Utilizzo delle librerie client
Al momento, puoi utilizzare GoogleSQL solo con le tabelle in cluster.
Vai
Prima di provare questo esempio, segui le istruzioni di configurazione Go riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Go.
Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.
Java
Prima di provare questo esempio, segui le istruzioni di configurazione Java riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Java.
Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.
Python
Prima di provare questo esempio, segui le istruzioni di configurazione Python riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Python.
Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.
Autorizzazioni obbligatorie
Per eseguire un job di query, devi disporre dell'bigquery.jobs.create
autorizzazione Identity and Access Management (IAM) per il progetto che esegue il job di query.
Ciascuno dei seguenti ruoli IAM predefiniti include le autorizzazioni necessarie per eseguire un job di query:
roles/bigquery.admin
roles/bigquery.jobUser
roles/bigquery.user
Inoltre, devi disporre dell'autorizzazione bigquery.tables.getData
su tutte le tabelle e le viste a cui fa riferimento la query. Inoltre, quando esegui query su una vista, devi disporre di questa autorizzazione su tutte le tabelle e le viste sottostanti.
Tuttavia, se utilizzi visualizzazioni autorizzate o set di dati autorizzati, non è necessario accedere ai dati di origine sottostanti.
Ciascuno dei seguenti ruoli IAM predefiniti include l'autorizzazione necessaria per tutte le tabelle e le viste a cui fa riferimento la query:
roles/bigquery.admin
roles/bigquery.dataOwner
roles/bigquery.dataEditor
roles/bigquery.dataViewer
Per ulteriori informazioni sui ruoli IAM in BigQuery, consulta Ruoli e autorizzazioni predefiniti.
Best practice
Per ottenere le migliori prestazioni dalle query sulle tabelle in cluster, segui le seguenti best practice.
Per contesto, la tabella di esempio utilizzata negli esempi di best practice è una tabella cluster creata utilizzando un'istruzione DDL. L'istruzione DDL
crea una tabella denominata ClusteredSalesData
. La tabella è raggruppata in cluster in base alle seguenti colonne: customer_id
, product_id
, order_id
, nell'ordine di ordinamento specificato.
CREATE TABLE `mydataset.ClusteredSalesData` PARTITION BY DATE(timestamp) CLUSTER BY customer_id, product_id, order_id AS SELECT * FROM `mydataset.SalesData`
Filtrare le colonne raggruppate in base all'ordine di ordinamento
Quando specifichi un filtro, utilizza espressioni che filtrano le colonne raggruppate
in ordine di ordinamento. L'ordinamento è l'ordine delle colonne specificato nella clausola CLUSTER BY
.
Per usufruire dei vantaggi del clustering, includi tutte le colonne raggruppate o un sottoinsieme di colonne nell'ordine di ordinamento da sinistra a destra, a partire dalla prima colonna. Ad esempio, se l'ordinamento delle colonne è A
, B
, C
, una query che filtra in base a A
e B
potrebbe trarre vantaggio dal clustering, ma non una query che filtra in base a B
e C
. L'ordinamento dei nomi delle colonne all'interno
dell'espressione di filtro non influisce sul rendimento.
L'esempio seguente esegue query sulla tabella clusterizzata ClusteredSalesData
creata nell'esempio precedente. La query include un'espressione di filtro che filtra in base a customer_id
e poi a product_id
. Questa query ottimizza il rendimento filtrando le colonne raggruppate in ordine di ordinamento, ovvero l'ordine delle colonne specificato nella clausola CLUSTER BY
.
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE customer_id = 10000 AND product_id LIKE 'gcp_analytics%'
La seguente query non filtra le colonne raggruppate in base all'ordine di ordinamento. Di conseguenza, le prestazioni della query non sono ottimali. Questa query filtra in base a
product_id
e poi a order_id
(saltando customer_id
).
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE product_id LIKE 'gcp_analytics%' AND order_id = 20000
Non utilizzare colonne raggruppate in espressioni di filtro complesse
Se utilizzi una colonna in cluster in un'espressione di filtro complessa, le prestazioni della query non sono ottimizzate perché non è possibile applicare l'eliminazione dei blocchi.
Ad esempio, la seguente query non eliminerà i blocchi perché una colonna in cluster, customer_id
, viene utilizzata in una funzione nell'espressione di filtro.
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE CAST(customer_id AS STRING) = "10000"
Per ottimizzare le prestazioni delle query eliminando i blocchi, utilizza semplici espressioni di filtro come la seguente. In questo esempio, viene applicato un semplice filtro alla colonna raggruppata customer_id
.
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE customer_id = 10000
Non confrontare le colonne raggruppate con altre colonne
Se un'espressione di filtro confronta una colonna raggruppata con un'altra colonna (colonna raggruppata o non raggruppata), il rendimento della query non è ottimizzato perché non è possibile applicare l'eliminazione dei blocchi.
La seguente query non elimina i blocchi perché l'espressione filtro confronta
una colonna raggruppata (customer_id
) con un'altra colonna (order_id
).
SELECT SUM(totalSale) FROM `mydataset.ClusteredSalesData` WHERE customer_id = order_id
Sicurezza delle tabelle
Per controllare l'accesso alle tabelle in BigQuery, consulta Introduzione ai controlli di accesso alle tabelle.
Passaggi successivi
- Per ulteriori informazioni sull'esecuzione di query, consulta Eseguire query interattive e batch.
- Per scoprire come creare e utilizzare le tabelle in cluster, consulta Creare e utilizzare le tabelle in cluster.
- Per una panoramica del supporto delle tabella partizionata in BigQuery, consulta Introduzione alle tabelle partizionate.
- Per scoprire come creare tabelle partizionate, consulta Creazione di tabelle partizionate.