Utilizzare le viste materializzate
Questo documento fornisce informazioni aggiuntive sulle viste materializzate e su come utilizzarle. Prima di leggere questo documento, acquisisci familiarità con Introduzione alle viste materializzate e Crea viste materializzate.
Esegui query sulle viste materializzate
Puoi eseguire query direttamente sulle viste materializzate, nello stesso modo in cui esegui una query tabella o visualizzazione standard. Le query sulle viste materializzate sono sempre coerenti con query sulle tabelle di base della vista, anche se le tabelle sono cambiate dall'ultima volta che la vista materializzata è stata aggiornata. L'esecuzione di query non attiva automaticamente un aggiornamento materializzato.
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per eseguire query su una vista materializzata,
chiedi all'amministratore di concederti
Ruolo IAM Visualizzatore dati BigQuery (roles/bigquery.dataViewer
) nella tabella di base della vista materializzata e della vista materializzata stessa.
Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.
Questo ruolo predefinito contiene le autorizzazioni necessarie per eseguire query su una vista materializzata. Per visualizzare le autorizzazioni esatte richieste, espandi la sezione Autorizzazioni richieste:
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 ruoli personalizzati altri ruoli predefiniti.
Queste autorizzazioni sono necessarie per le query per poter usufruire del tuning intelligente.
Per ulteriori informazioni sui ruoli IAM in BigQuery, consulta Introduzione a IAM.
Aggiornamenti incrementali
BigQuery combina i dati della visualizzazione memorizzata nella cache con nuovi dati per
a risultati della query coerenti, continuando a usare la vista materializzata. Per
viste materializzate a tabella singola, è possibile se la tabella di base non è stata modificata
dall'ultimo aggiornamento o se sono stati aggiunti solo nuovi dati. Solo per JOIN
visualizzazioni,
le tabelle sul lato sinistro di JOIN
possono avere dati aggiunti. Se una delle tavole sul lato destro di un JOIN
è stata modificata, 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 maggiori informazioni su join e viste materializzate, consulta la sezione Join. Di seguito sono riportati esempi di azioni della console Google Cloud, dello strumento a riga di comando bq e dell'API che possono causare un aggiornamento o un'eliminazione:
- Istruzioni
UPDATE
,MERGE
oDELETE
del linguaggio di manipolazione dei dati (DML) - Troncamento
- Scadenza partizione
Le seguenti operazioni sui metadati impediscono inoltre l'aggiornamento incrementale di una vista materializzata:
- Modificare la 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 dettagli sul motivo per cui un job non ha utilizzato i dati di vista materializzata, consulta Comprendere il motivo le viste materializzate erano rifiutato. Inoltre, le viste materializzate non possono essere aggiornate in modo incrementale se la tabella di base ha accumulato modifiche non elaborate per un periodo di tempo maggiore dell'intervallo di viaggio nel tempo della tabella.
Allineamento della partizione
Se una vista materializzata viene partizionata, BigQuery assicura che
siano allineate alle partizioni del partizionamento
colonna. Allineati significa che i dati di una particolare partizione del
contribuisce alla stessa partizione della vista materializzata. Per
Ad esempio, una riga della partizione 20220101
della tabella di base potrebbe contribuire solo
per partizionare 20220101
della vista materializzata.
Quando una vista materializzata viene suddivisa, il comportamento descritto in 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 con aggregazione con join interni possono essere allineate solo a una delle relative tavole 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 utilizzare di visualizzazioni laddove possibile. La riscrittura automatica migliora le prestazioni e il costo delle query e non modifica i risultati delle query. Le query non vengono attivate automaticamente un aggiornamento materializzato. Affinché una query venga riscritta, vista materializzata deve soddisfare le seguenti condizioni:
- Appartenere allo stesso set di dati di una delle relative tabelle di base.
- Utilizza lo stesso set di tabelle di base della query.
- Includi tutte le colonne lette.
- Includi tutte le righe lette.
Esempi di ottimizzazione intelligente
Considera l'esempio seguente di query sulla 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
I seguenti esempi mostrano query e perché sono o meno riscritta automaticamente utilizzando questa visualizzazione:
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(profitto_netto) AS somma_profitto FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '01-01-2021' E promo_id IS NOT NULL AND customer_id = 12345 |
No | La visualizzazione deve includere tutte le colonne lette. La visualizzazione non include "customer". |
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 vista deve includere tutte le colonne lette. 'sold_datetime' non è un (ma "CAST(sold_datetime AS DATE)' lo è). |
SELECT SUM(profitto_netto) AS somma_profitto FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '01-01-2021' E promo_id IS NOT NULL AND store_id = 12345 |
Sì | |
SELECT SUM(profitto_netto) AS somma_profitto FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '01-01-2021' E promo_id = 12345 |
No | La visualizzazione deve includere tutte le righe lette. 'promo_id' non è un output, quindi non sarà possibile applicare il filtro più restrittivo 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 delle visualizzazioni per le date del 2021 e dopo, ma la query riporta le date del 2020. |
SELECT SUM(profitto_netto) AS somma_profitto FROM dataset.store_sales WHERE CAST(sold_datetime AS DATE) >= '01-01-2022' E promo_id IS NOT NULL |
Sì |
Capire se una query è stata riscritta
Per capire se una query è stata riscritta dall'ottimizzazione intelligente per utilizzare un modello
vista, 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. A
per capire perché una query non ha utilizzato una vista materializzata, consulta la sezione Comprendere perché
le viste materializzate sono state rifiutate.
Comprendere perché le viste materializzate sono state rifiutate
Se hai disattivato l'aggiornamento automatico per la vista materializzata e la tabella contiene modifiche non elaborate, la query potrebbe essere più veloce per diversi giorni, quindi ripristina la query originale con conseguente riduzione della velocità di elaborazione. Per trarre vantaggio dalle viste materializzate, abilita l'aggiornamento automatico o manualmente regolarmente e monitorare i job di aggiornamento della vista materializzata per confermarne l'esito.
I passaggi per capire perché una vista materializzata è stata rifiutata dipendono dal tipo di query utilizzata:
- Query diretta della vista materializzata
- Query indiretta in cui l'ottimizzazione intelligente potrebbe scegliere di utilizzare il metodo vista materializzata
Le seguenti sezioni forniscono i passaggi per aiutarti a capire perché un modello visualizzazione è stata rifiutata.
Query diretta delle viste materializzate
Le query dirette delle viste materializzate potrebbero non utilizzare i dati memorizzati nella cache in alcune circostanze. 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 delle viste materializzate e individua la vista materializzata di destinazione nel campo
materialized_view_statistics
per la query. - Se
chosen
è presente nelle statistiche e il suo valore èTRUE
, vista materializzata utilizzata dalla query. - Esamina il campo
rejected_reason
per trovare 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 delle viste materializzate e individua la vista materializzata di destinazione in
materialized_view_statistics
per la query. - Consulta il
rejected_reason
per conoscere i passaggi successivi. Ad esempio, se Il valore direjected_reason
èCOST
, l'ottimizzazione intelligente ne identifica altri di origini dati efficienti in termini di costi e prestazioni. - Se la vista materializzata non è presente, prova a eseguire una query diretta del vista materializzata e segui i passaggi descritti in Query diretta sul visualizzazioni.
- Se la query diretta non utilizza la vista materializzata, la forma della vista materializzata non corrisponde alla query. Per saperne di più sull'ottimizzazione intelligente e su come le query vengono riscritte utilizzando le viste materializzate, consulta Esempi di ottimizzazione intelligente.
Domande frequenti
Quando devo utilizzare le query pianificate rispetto alle viste materializzate?
Le query pianificate sono un modo pratico per eseguire periodicamente calcoli arbitrariamente complessi. Ogni volta che viene eseguita, la query viene eseguita completamente, senza alcun vantaggio dai risultati precedenti, e paghi l'intero costo computazionale della query. Le query pianificate sono ideali quando non hai bisogno delle query e hanno un'alta tolleranza all'inattività dei dati.
Le viste materializzate sono più adatte quando devi eseguire query sui dati più recenti
con latenza e costi ridotti al minimo, riutilizzando il risultato calcolato in precedenza.
Puoi utilizzare le viste materializzate come pseudo-indici, accelerando le query alla tabella di base senza aggiornare i flussi di lavoro esistenti. La --max_staleness
opzione
consente di definire l'obsolescenza accettabile per le viste materializzate, fornendo
prestazioni costantemente elevate con costi controllati durante l'elaborazione
set di dati di grandi dimensioni
che cambiano frequentemente.
Come linea guida generale, se possibile e se non esegui calcoli arbitrariamente complessi, utilizza le viste materializzate.
Alcune query sulle viste materializzate sono più lente rispetto alle stesse query sulle tabelle materializzate manualmente. Perché?
In generale, una query su una vista materializzata non ha sempre le prestazioni migliori di una la query sulla tabella materializzata equivalente. Il motivo è che le viste materializzate restituiscono sempre risultati aggiornati e devono tenere conto delle modifiche apportate alle tabelle di base 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 10
SELECT * FROM my_dataset.my_materialized_table LIMIT 10
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'
SELECT SUM(total_paid) FROM my_dataset.my_materialized_table WHERE date > '2020-12-01'