Utilizza viste materializzate
Questo documento fornisce ulteriori informazioni sulle viste materializzate e su come utilizzarle. Prima di leggere questo documento, acquisisci familiarità con le sezioni Introduzione alle viste materializzate e Creare viste materializzate.
Esegui query sulle viste materializzate
Puoi eseguire query direttamente sulle viste materializzate, nello stesso modo in cui esegui una query su una tabella normale o una vista standard. Le query sulle viste materializzate sono sempre coerenti con le query sulle tabelle di base della vista, anche se queste tabelle sono cambiate dopo l'ultimo aggiornamento della vista materializzata. Le query non attivano automaticamente un aggiornamento materializzato.
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per eseguire query su una vista materializzata,
chiedi all'amministratore di concederti il ruolo IAM
Visualizzatore dati BigQuery (roles/bigquery.dataViewer
) sulla tabella di base della vista materializzata e della vista materializzata stessa.
Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso.
Questo ruolo predefinito contiene le autorizzazioni necessarie per eseguire query su una vista materializzata. Per visualizzare esattamente le autorizzazioni necessarie, espandi la sezione Autorizzazioni obbligatorie:
Autorizzazioni obbligatorie
Per eseguire query su una vista materializzata sono necessarie le seguenti autorizzazioni:
-
bigquery.tables.get
-
bigquery.tables.getData
Potresti anche riuscire a ottenere queste autorizzazioni con i ruoli personalizzati o altri ruoli predefiniti.
Queste autorizzazioni sono necessarie per le query al fine di trarre vantaggio dall'ottimizzazione intelligente.
Per ulteriori informazioni sui ruoli IAM in BigQuery, consulta Introduzione a IAM.
Aggiornamenti incrementali
BigQuery combina i dati della vista memorizzata nella cache con nuovi dati per fornire risultati di query coerenti pur continuando a utilizzare la vista materializzata. Per
le viste materializzate a una singola tabella, è possibile se la tabella di base è rimasta invariata
dall'ultimo aggiornamento o se sono stati aggiunti solo nuovi dati. Per le viste JOIN
, solo
le tabelle sul lato sinistro di JOIN
possono avere dati aggiunti. Se una delle tabelle sul lato destro di JOIN
è cambiata, la visualizzazione non può essere aggiornata in modo incrementale.
Se la tabella di base ha ricevuto aggiornamenti o eliminazioni dall'ultimo aggiornamento o se le tabelle di base della vista materializzata sul lato destro di JOIN
sono cambiate, BigQuery ripristina automaticamente la query originale. Per
scoprire di più sui join e sulle viste materializzate, consulta
Join. Di seguito sono riportati alcuni esempi di console Google Cloud, strumento a riga di comando bq e azioni dell'API che possono causare un aggiornamento o un'eliminazione:
- Istruzioni
UPDATE
,MERGE
oDELETE
DML (Data Manipulation Language) - Troncamento
- Scadenza partizione
Anche le seguenti operazioni sui metadati impediscono l'aggiornamento incrementale di una vista materializzata:
- Modifica della scadenza della partizione
- Aggiornamento o eliminazione di una colonna
Se una vista materializzata non può essere aggiornata in modo incrementale, i relativi dati memorizzati nella cache non vengono utilizzati dalle query finché la vista non viene aggiornata automaticamente o manualmente. Per maggiori dettagli sul motivo per cui un job non ha utilizzato i dati delle vista materializzata, consulta Comprendere perché le viste materializzate sono state rifiutate.
Allineamento della partizione
Se una vista materializzata è partizionata, BigQuery garantisce che le sue partizioni siano allineate con le partizioni della colonna di partizione della tabella di base. Allineati significa che i dati di una particolare partizione della tabella di base contribuiscono alla stessa partizione della vista materializzata. Ad esempio, una riga dalla partizione 20220101
della tabella di base contribuirebbe solo alla partizione 20220101
della vista materializzata.
Quando una vista materializzata viene partizionata, il comportamento descritto nella sezione Aggiornamenti incrementali si verifica per ogni singola partizione. Ad esempio, se i dati vengono eliminati in una partizione della tabella di base, BigQuery può comunque utilizzare le altre partizioni della vista materializzata.
Le viste materializzate con giunti interni possono essere allineate solo a una delle tabelle di base. Se una delle tabelle di base non allineate cambia, influisce sull'intera vista.
Ottimizzazione intelligente
BigQuery riscrive automaticamente le query in modo da usare le viste materializzate, se possibile. La riscrittura automatica migliora le prestazioni e i costi delle query e non ne modifica i risultati. Le query non attivano automaticamente un aggiornamento materializzato. Affinché una query venga riscritta, la vista materializzata deve soddisfare le seguenti condizioni:
- Appartengono allo stesso set di dati di una delle sue tabelle di base.
- Utilizza lo stesso set di tabelle di base della query.
- Includere tutte le colonne lette.
- Includere tutte le righe lette.
Esempi di ottimizzazione intelligente
Considera il seguente esempio di query di vista materializzata:
SELECT store_id, CAST(sold_datetime AS DATE) AS sold_date SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '2021-01-01' AND promo_id IS NOT NULL GROUP BY 1, 2
Gli esempi seguenti mostrano query e perché queste query vengono o non vengono riscritte automaticamente utilizzando questa vista:
Query | Riscrivere? | Motivo |
---|---|---|
SELECT SUM(net_paid) AS sum_paid, SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '2021-01-01' AND promo_id IS NOT NULL |
No | La visualizzazione deve includere tutte le colonne lette. La visualizzazione non include "SUM(net_paid)". |
SELECT SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '2021-01-01' AND promo_id IS NOT NULL |
Sì | |
SELECT SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '2021-01-01' AND promo_id IS NOT NULL AND customer_id = 12345 |
No | La visualizzazione deve includere tutte le colonne lette. La visualizzazione non include "cliente". |
SELECT SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE sold_datetime= '2021-01-01' AND promo_id IS NOT NULL |
No | La visualizzazione deve includere tutte le colonne lette. "sold_datetime" non è un output, al contrario di "CAST(sold_datetime AS DATE)"). |
SELECT SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '2021-01-01' AND promo_id IS NOT NULL AND store_id = 12345 |
Sì | |
SELECT SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '2021-01-01' AND promo_id = 12345 |
No | La visualizzazione deve includere tutte le righe lette. "promo_id" non è un output, quindi il filtro più restrittivo non può essere applicato alla vista. |
SELECT SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '2020-01-01' |
No | La visualizzazione deve includere tutte le righe lette. Il filtro della visualizzazione per le date del 2021 e successive, ma la query legge le date del 2020. |
SELECT SUM(net_profit) AS sum_profit FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '2022-01-01' AND promo_id IS NOT NULL |
Sì |
Capire se una query è stata riscritta
Per capire se una query è stata riscritta dall'ottimizzazione intelligente per utilizzare una vista materializzata, esamina il piano di query. Se la
query è stata riscritta, il piano di query contiene un passaggio READ my_materialized_view
, dove my_materialized_view
è il nome della vista materializzata utilizzata. Per capire perché una query non ha utilizzato una vista materializzata, consulta Comprendere perché le viste materializzate sono state rifiutate.
Comprendere perché le viste materializzate sono state rifiutate
Le query non possono utilizzare una vista materializzata per diversi motivi. I passaggi per capire perché una vista materializzata è stata rifiutata dipendono dal tipo di query utilizzato:
- Query diretta della vista materializzata
- Query indiretta in cui l'ottimizzazione intelligente potrebbe scegliere di utilizzare la vista materializzata
Le seguenti sezioni forniscono i passaggi per aiutarti a capire perché una vista materializzata è stata rifiutata.
Query diretta di viste materializzate
In determinate circostanze, le query dirette delle viste materializzate potrebbero non utilizzare i dati memorizzati nella cache. I seguenti passaggi possono aiutarti a capire perché i dati della vista materializzata non sono stati utilizzati:
- Segui i passaggi descritti in Monitorare l'utilizzo della vista materializzata e trova la vista materializzata di destinazione nel campo
materialized_view_statistics
per la query. - Se
chosen
è presente nelle statistiche e il suo valore èTRUE
, la vista materializzata viene utilizzata dalla query. - Esamina il campo
rejected_reason
per conoscere i passaggi successivi. Nella maggior parte dei casi, puoi aggiornare manualmente la vista materializzata o attendere il successivo aggiornamento automatico.
Query con ottimizzazione intelligente
- Segui i passaggi descritti in Monitorare l'utilizzo della vista materializzata e trova la vista materializzata di destinazione nella
materialized_view_statistics
relativa alla query. - Consulta il
rejected_reason
per conoscere i passaggi successivi. Ad esempio, se il valorerejected_reason
èCOST
, l'ottimizzazione intelligente ha identificato origini dati più efficienti in termini di costi e prestazioni. - Se la vista materializzata non è presente, prova a eseguire una query diretta della vista materializzata e segui i passaggi descritti in Query diretta sulle viste materializzate.
- Se la query diretta non utilizza la vista materializzata, la forma della vista materializzata non corrisponde alla query. Per ulteriori informazioni sull'ottimizzazione intelligente e su come le query vengono riscritte utilizzando le viste materializzate, vedi Esempi di ottimizzazione intelligente.
Domande frequenti
Quando devo utilizzare le query pianificate rispetto alle viste materializzate?
Le query pianificate sono un modo conveniente per eseguire periodicamente calcoli arbitrariamente complessi. Ogni volta che viene eseguita, la query viene eseguita completamente. I risultati precedenti non vengono utilizzati e paghi il prezzo intero per la query. Le query pianificate sono ideali quando non hai bisogno dei dati più recenti e hai un'elevata tolleranza nei confronti dell'inattività dei dati.
Le viste materializzate sono adatte quando devi eseguire query sui dati più recenti, riducendo al contempo latenza e costi riutilizzando il risultato calcolato in precedenza. Puoi utilizzare le viste materializzate come pseudo indici, accelerando le query verso la tabella di base senza aggiornare i flussi di lavoro esistenti. L'opzione --max_staleness
consente di definire l'inattività accettabile per le viste materializzate, fornendo prestazioni costantemente elevate con costi controllati durante l'elaborazione di grandi set di dati che cambiano frequentemente.
Come regola generale, quando possibile e se non esegui calcoli arbitrariamente complessi, utilizza le viste materializzate.
Alcune query su viste materializzate sono più lente delle stesse query su tabelle materializzate manualmente. Perché?
In generale, una query su una vista materializzata non ha sempre le prestazioni migliori di una query sulla tabella materializzata equivalente. Il motivo è che una vista materializzata garantisce di restituire sempre un risultato aggiornato e deve tenere conto delle modifiche alle tabelle di base aggiunte dall'ultimo aggiornamento della vista.
Considera questo scenario:
CREATE MATERIALIZED VIEW my_dataset.my_mv AS SELECT date, customer_id, region, SUM(net_paid) as total_paid FROM my_dataset.sales GROUP BY 1, 2, 3; CREATE TABLE my_dataset.my_materialized_table AS SELECT date, customer_id, region, SUM(net_paid) as total_paid FROM my_dataset.sales GROUP BY 1, 2, 3;
Ad esempio, questa query:
SELECT * FROM my_dataset.my_mv LIMIT 10in genere viene eseguita molto più lentamente di questa query:
SELECT * FROM my_dataset.my_materialized_table LIMIT 10Per fornire risultati costantemente aggiornati, BigQuery deve eseguire query sulle nuove righe della tabella di base e unirle nella vista materializzata prima di applicare il predicato "LIMIT 10". Di conseguenza, la lentezza rimane, anche se la vista materializzata è completamente aggiornata.
D'altra parte, le aggregazioni sulle viste materializzate sono in genere veloci quanto le query sulla tabella materializzata. Ad esempio:
SELECT SUM(total_paid) FROM my_dataset.my_mv WHERE date > '2020-12-01'La velocità deve essere la seguente:
SELECT SUM(total_paid) FROM my_dataset.my_materialized_table WHERE date > '2020-12-01'