Utilizza viste materializzate

Questo documento fornisce ulteriori informazioni sulle viste materializzate e su come utilizzarle. Prima di leggere questo documento, consulta gli argomenti Introduzione alle viste materializzate e Creazione di viste materializzate.

Esegui query sulle viste materializzate

Puoi eseguire query direttamente sulle viste materializzate, nello stesso modo in cui esegui 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 sono state modificate dall'ultima volta che la vista materializzata è stata aggiornata. 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) 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 visualizzare le autorizzazioni esatte necessarie, 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 essere in grado di 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, continuando a utilizzare la vista materializzata. Per le viste materializzate di una singola tabella, questo è possibile se la tabella di base è rimasta invariata dopo l'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 un JOIN è cambiata, la visualizzazione non può essere aggiornata in modo incrementale.

Se la tabella di base ha subito 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 ulteriori informazioni sui join e sulle viste materializzate, consulta join. Di seguito sono riportati alcuni esempi della console Google Cloud, dello strumento a riga di comando bq e delle azioni API che possono causare un aggiornamento o un'eliminazione:

  • Istruzioni UPDATE, MERGE o DELETE in Data Manipulation Language (DML)
  • Troncamento
  • Scadenza partizione

Inoltre, 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 non è possibile aggiornare in modo incrementale una vista materializzata, i relativi dati memorizzati nella cache non vengono utilizzati dalle query finché la visualizzazione non viene aggiornata automaticamente o manualmente. Per i dettagli sul motivo per cui un job non ha utilizzato i dati delle vista materializzata, consulta Capire perché le viste materializzate sono state rifiutate.

Allineamento delle partizioni

Se una vista materializzata è partizionata, BigQuery garantisce che le sue partizioni siano allineate con le partizioni della colonna di partizionamento della tabella di base. Allineato significa che i dati di una determinata partizione della tabella di base contribuiscono alla stessa partizione della vista materializzata. Ad esempio, una riga della partizione 20220101 della tabella di base contribuirà solo alla partizione 20220101 della vista materializzata.

Quando una vista materializzata viene partizionata, il comportamento descritto negli 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 join interni possono essere allineate solo a una delle tabelle di base. La modifica di una delle tabelle di base non allineate influisce sull'intera vista.

Sintonizzazione intelligente

BigQuery riscrive automaticamente le query per utilizzare 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 insieme di tabelle di base della query.
  • Includi tutte le colonne in fase di lettura.
  • Includi tutte le righe lette.

Esempi di ottimizzazione intelligente

Considera il seguente esempio di query relativa alla 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 le query e perché sono o non vengono riscritte 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
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, ma "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
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, pertanto il filtro più restrittivo non può essere applicato alla visualizzazione.
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 vista per le date dal 2021 in poi, ma la query legge le date dal 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

Comprendere se una query è stata riscritta

Per capire se una query è stata riscritta mediante l'ottimizzazione intelligente per utilizzare una vista materializzata, controlla 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 visualizzazioni materializzate sono state rifiutate

Nelle query non è possibile 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 capire perché una vista materializzata è stata rifiutata.

Query diretta delle viste materializzate

Le query dirette delle viste materializzate potrebbero non utilizzare i dati memorizzati nella cache in determinate circostanze. I seguenti passaggi possono aiutarti a capire perché non sono stati utilizzati i dati della vista materializzata:

  1. Segui i passaggi descritti in Monitorare l'utilizzo delle viste materializzate e trova la vista materializzata di destinazione nel campo materialized_view_statistics per la query.
  2. Se chosen è presente nella statistica e il suo valore è TRUE, la vista materializzata viene utilizzata dalla query.
  3. Esamina il campo rejected_reason per sapere come procedere. Nella maggior parte dei casi, puoi aggiornare manualmente la vista materializzata o attendere il successivo aggiornamento automatico.

Query con ottimizzazione intelligente

  1. Segui i passaggi descritti in Monitorare l'utilizzo delle viste materializzate e trova la vista materializzata di destinazione nella materialized_view_statistics per la query.
  2. Leggi le rejected_reason per sapere come procedere. Ad esempio, se il valore di rejected_reason è COST, l'ottimizzazione intelligente ha identificato origini dati più efficienti per costi e prestazioni.
  3. 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.
  4. 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, consulta Esempi di ottimizzazione intelligente.

Domande frequenti

Quando devo utilizzare le query pianificate e le viste materializzate?

Le query pianificate sono un modo comodo per eseguire periodicamente calcoli arbitrariamente complessi. Ogni volta che la query viene eseguita, viene eseguita completamente. I risultati precedenti non vengono utilizzati e paghi il prezzo intero per la query. Le query pianificate sono perfette quando non hai bisogno dei dati più recenti e hai un'alta tolleranza per l'inattività dei dati.

Le viste materializzate sono ideali per 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 nella tabella di base senza aggiornare i flussi di lavoro esistenti. L'opzione --max_staleness consente di definire un livello di inattività accettabile per le viste materializzate, fornendo prestazioni sempre elevate e costi controllati durante l'elaborazione di set di dati di grandi dimensioni e che cambiano spesso.

Come regola generale, quando possibile e se non esegui calcoli arbitrari in modo arbitrario, utilizza le viste materializzate.

Alcune query sulle viste materializzate sono più lente di quelle stesse su tabelle materializzate manualmente. Perché?

In generale, una query su una vista materializzata non ha sempre le stesse prestazioni di una query sulla tabella materializzata equivalente. Il motivo è che una vista materializzata garantisce che restituisca sempre un risultato nuovo e che 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 10
in genere è molto più lenta di questa query:
  SELECT * FROM my_dataset.my_materialized_table LIMIT 10
Per fornire risultati costantemente aggiornati, BigQuery deve eseguire una query su nuove righe della tabella di base e unirle nella vista materializzata prima di applicare il predicato "LIMIT 10". Di conseguenza, la lentezza permane, anche se la vista materializzata è completamente aggiornata.

D'altra parte, le aggregazioni su viste materializzate sono in genere veloci quanto le query con la tabella materializzata. Ad esempio:

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