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 usate 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 colonne in cluster. Le query che filtrano le colonne in cluster in genere hanno un rendimento migliore rispetto a quelle che filtrano solo le 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
Puoi utilizzare solo GoogleSQL con le tabelle in cluster.
Vai
Prima di provare questo esempio, segui le istruzioni di configurazione di Go nella guida rapida di BigQuery per l'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Go.
Per eseguire l'autenticazione in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.
Java
Prima di provare questo esempio, segui le istruzioni di configurazione di Java nella guida rapida di BigQuery per l'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Java.
Per eseguire l'autenticazione in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.
Python
Prima di provare questo esempio, segui le istruzioni di configurazione di Python nella guida rapida di BigQuery per l'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Python.
Per eseguire l'autenticazione in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.
Autorizzazioni obbligatorie
Per eseguire un job di query, devi disporre dell'autorizzazione Identity and Access Management (IAM) bigquery.jobs.create
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
Devi anche disporre dell'autorizzazione bigquery.tables.getData
per tutte le tabelle e le viste a cui fa riferimento la query. Inoltre, quando esegui query
su una vista, devi disporre di questa autorizzazione per tutte le tabelle e le viste sottostanti.
Tuttavia, se utilizzi viste autorizzate
o set di dati autorizzati, non hai bisogno
dell'accesso 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 saperne di più sui ruoli IAM in BigQuery, vedi Ruoli e autorizzazioni predefiniti.
Best practice
Per ottenere le migliori prestazioni dalle query sulle tabelle in cluster, utilizza le seguenti best practice.
Per contesto, la tabella di esempio utilizzata negli esempi di best practice è una
tabella in 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
, in questo ordine di ordinamento.
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'ordine di ordinamento è l'ordine delle colonne specificato nella clausola CLUSTER BY
.
Per usufruire dei vantaggi del clustering, includi una o più colonne raggruppate
nell'ordine di ordinamento da sinistra a destra, a partire dalla prima colonna. Nella maggior parte
dei casi, la prima colonna di clustering è la più efficace per l'eliminazione
dei blocchi, seguita dalla seconda e poi dalla terza. Puoi comunque utilizzare la seconda
o la terza colonna da sola nella query, ma l'eliminazione dei blocchi probabilmente
non sarà altrettanto efficace. L'ordine dei nomi delle colonne all'interno dell'espressione
del filtro non influisce sul rendimento.
L'esempio seguente esegue una query sulla tabella in cluster ClusteredSalesData
creata nell'esempio precedente. La query include un'espressione di filtro che filtra in base a customer_id
e poi in base a product_id
. Questa query
ottimizza il rendimento filtrando le colonne in cluster 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 in cluster in ordine di ordinamento. Di conseguenza, le prestazioni della query non sono ottimali. Questa query filtra in base a
product_id
e poi in base 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 clusterizzate in espressioni di filtro complesse
Se utilizzi una colonna in cluster in un'espressione di filtro complessa, le prestazioni della query non vengono ottimizzate perché non è possibile applicare l'eliminazione dei blocchi.
Ad esempio, la seguente query non elimina 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 espressioni di filtro semplici
come le seguenti. In questo esempio, viene applicato un semplice filtro alla
colonna in cluster: 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 in cluster con un'altra colonna (in cluster o non in cluster), il rendimento della query non viene ottimizzato perché non è possibile applicare l'eliminazione dei blocchi.
La seguente query non elimina i blocchi perché l'espressione filtro confronta
una colonna in cluster, 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, vedi Controllare l'accesso alle risorse con IAM.
Passaggi successivi
- Per maggiori informazioni sull'esecuzione di query, consulta la sezione Esecuzione di query interattive e batch.
- Per scoprire come creare e utilizzare le tabelle in cluster, consulta Creazione e utilizzo delle 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.