Utilizza viste materializzate

Questo documento fornisce ulteriori informazioni sulle viste materializzate e su come per utilizzarli. 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 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.

Questo ruolo predefinito contiene le autorizzazioni necessarie per eseguire query su una vista materializzata. Per vedere le autorizzazioni esatte obbligatorie, 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 ruoli personalizzati e altri ruoli predefiniti.

Queste autorizzazioni sono necessarie per le query al fine di poter trarre vantaggio ottimizzazione intelligente.

Per ulteriori informazioni per i 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 uno dei sul lato destro di JOIN è cambiata, quindi la visualizzazione non può essere 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 per ulteriori informazioni su join e viste materializzate, consulta Join. La di seguito sono riportati alcuni esempi di console Google Cloud, strumento a riga di comando bq e azioni API che possono causare un aggiornamento o un'eliminazione:

  • Istruzioni UPDATE, MERGE o DELETE 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 vengono non è utilizzato dalle query finché la visualizzazione 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.

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 partizionata, il comportamento descritto Gli aggiornamenti incrementali avvengono per ogni individuo della partizione di testo. Ad esempio, se i dati vengono eliminati in una partizione di tabella di base, BigQuery può comunque utilizzare alle altre partizioni della vista.

Le viste materializzate con join interni possono essere allineate solo a una delle loro base tabelle. 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 delle query e i costi e i risultati delle query non cambiano. Le query non vengono attivate automaticamente un aggiornamento materializzato. Affinché una query venga riscritta, 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

I seguenti esempi mostrano query e perché sono o meno riscritta automaticamente utilizzando questa visualizzazione:

Query Riscrivere? Motivo
SELEZIONA
SUM(net_paid) AS sum_paid,
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
No La visualizzazione deve includere tutte le colonne lette. La visualizzazione non include "SUM(net_paid)".
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
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(profitto_netto) AS somma_profitto
FROM dataset.store_sales
WHERE
sold_datetime= '2021-01-01' E
promo_id IS NOT NULL
No La visualizzazione 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
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(profitto_netto) AS somma_profitto
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

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 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

Le query non possono utilizzare una vista materializzata per diversi motivi. I passaggi per comprendere il motivo del rifiuto di una vista materializzata dipendono dal tipo di query utilizzato:

  • Query diretta della vista materializzata
  • Query indiretta in cui l'ottimizzazione intelligente potrebbe scegliere di utilizzare il parametro vista materializzata

Le seguenti sezioni forniscono i passaggi per aiutarti a capire perché un modello visualizzazione è stata rifiutata.

Query diretta di 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é il modello visualizza dati non utilizzati:

  1. Segui i passaggi descritti in Monitorare la vista materializzata usa e trova la vista materializzata di destinazione Campo materialized_view_statistics per la query.
  2. Se chosen è presente nelle statistiche e il suo valore è TRUE, vista materializzata utilizzata dalla query.
  3. Esamina il campo rejected_reason per conoscere i passaggi successivi. Nella maggior parte dei casi, puoi aggiorna manualmente vista materializzata o attendere la successiva visualizzazione automatica aggiorna.

Query con ottimizzazione intelligente

  1. Segui i passaggi descritti in Monitorare la vista materializzata usa e trova la vista materializzata di destinazione materialized_view_statistics per la query.
  2. Consulta il rejected_reason per conoscere i passaggi successivi. Ad esempio, se Il valore di rejected_reason è COST, poi l'ottimizzazione intelligente ne identifica altri di origini dati efficienti in termini di costi e prestazioni.
  3. 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.
  4. Se la query diretta non utilizza la vista materializzata, la forma del vista materializzata non corrisponde alla query. Per ulteriori informazioni sui ottimizzazione e 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 pratico per eseguire arbitrariamente complessa i calcoli periodicamente. Ogni volta che viene eseguita, la query viene eseguita completamente. La i risultati precedenti non vengono usati e paghi il prezzo intero per la query. Le query pianificate sono ideali quando non hai bisogno dei dati più recenti e hai una un'elevata tolleranza per l'inattività dei dati.

Le viste materializzate sono adatte quando devi eseguire query sui dati più recenti riducendo latenza e costi riutilizzando il risultato calcolato in precedenza. Puoi usano le viste materializzate come pseudo indici, accelerando le query verso la 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 regola generale, quando possibile e se non esegui la pubblicazione in modo arbitrario calcoli complessi, usa 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 la query sulla tabella materializzata equivalente. Il motivo è che un modello di visualizzare le garanzie di restituire sempre un risultato aggiornato e questo deve tenere conto 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 10
in genere è molto più lento rispetto a questa query:
  SELECT * FROM my_dataset.my_materialized_table LIMIT 10
Per fornire dati costantemente aggiornati risultati, BigQuery deve eseguire una query sulle nuove righe della tabella di base e uniscili alla vista materializzata prima di applicare "LIMIT 10" predicato. Di conseguenza, la lentezza rimane, anche se la vista materializzata è completamente sempre aggiornate.

Le aggregazioni sulle viste materializzate, invece, sono generalmente veloci come le query la tabella materializzata. Ad esempio:

  SELECT SUM(total_paid) FROM my_dataset.my_mv WHERE date > '2020-12-01'
Deve essere veloce come questa:
  SELECT SUM(total_paid) FROM my_dataset.my_materialized_table WHERE date > '2020-12-01'