Gestire le viste materializzate

Questo documento descrive come gestire le viste materializzate in BigQuery.

La gestione delle viste materializzate di BigQuery include le seguenti operazioni:

Per ulteriori informazioni sulle visualizzazioni materializzate, consulta quanto segue:

Prima di iniziare

Concedi i ruoli IAM (Identity and Access Management) che concedono agli utenti le autorizzazioni necessarie per eseguire ogni attività in questo documento. Le autorizzazioni richieste per eseguire un'attività (se presenti) sono elencate nella sezione "Autorizzazioni richieste" dell'attività.

Modificare le viste materializzate

Puoi modificare una vista materializzata tramite la console Google Cloud o lo strumento a riga di comando bq utilizzando il linguaggio di definizione dei dati (DDL) con ALTER MATERIALIZED VIEW e SET OPTIONS. Per un elenco di opzioni di vista materializzata, consulta materialized_view_set_options_list.

Di seguito è riportato un esempio che imposta enable_refresh su true. Modificali come necessario in base al tuo caso d'uso.

Autorizzazioni obbligatorie

Per modificare le viste materializzate, devi disporre delle autorizzazioni IAM bigquery.tables.get e bigquery.tables.update.

Ciascuno dei seguenti ruoli IAM predefiniti include le autorizzazioni necessarie per modificare una vista materializzata:

  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

Per saperne di più su Identity and Access Management (IAM) di BigQuery, consulta Ruoli e autorizzazioni predefiniti.

SQL

Per modificare una vista materializzata, utilizza l'istruzione DDL ALTER MATERIALIZED VIEW SET OPTIONS:

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'editor di query, inserisci la seguente istruzione:

    ALTER MATERIALIZED VIEW PROJECT.DATASET.MATERIALIZED_VIEW
    SET OPTIONS (enable_refresh = true);

    Sostituisci quanto segue:

    • PROJECT: il nome del progetto che contiene la vista materializzata
    • DATASET: il nome del set di dati che contiene la vista materializzata
    • MATERIALIZED_VIEW: il nome della vista materializzata che vuoi modificare

  3. Fai clic su Esegui.

Per ulteriori informazioni su come eseguire query, consulta Eseguire una query interattiva.

bq

Esegui il comando bq update:

bq update \
--enable_refresh=true \
--refresh_interval_ms= \
PROJECT.DATASET.MATERIALIZED_VIEW

Java

Prima di provare questo esempio, segui le istruzioni di configurazione Java riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Java.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.MaterializedViewDefinition;
import com.google.cloud.bigquery.Table;
import com.google.cloud.bigquery.TableId;

// Sample to update materialized view
public class UpdateMaterializedView {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String materializedViewName = "MY_MATERIALIZED_VIEW_NAME";
    updateMaterializedView(datasetName, materializedViewName);
  }

  public static void updateMaterializedView(String datasetName, String materializedViewName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, materializedViewName);

      // Get existing materialized view
      Table table = bigquery.getTable(tableId);
      MaterializedViewDefinition materializedViewDefinition = table.getDefinition();
      // Update materialized view
      materializedViewDefinition
          .toBuilder()
          .setEnableRefresh(true)
          .setRefreshIntervalMs(1000L)
          .build();
      table.toBuilder().setDefinition(materializedViewDefinition).build().update();
      System.out.println("Materialized view updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Materialized view was not updated. \n" + e.toString());
    }
  }
}

Elenca le viste materializzate

Puoi elencare le visualizzazioni materializzate tramite la console Google Cloud, lo strumento a riga di comando bq o l'API BigQuery.

Autorizzazioni obbligatorie

Per elencare le viste materializzate in un set di dati, devi disporre dell'autorizzazione IAM bigquery.tables.list.

Ciascuno dei seguenti ruoli IAM predefiniti include le autorizzazioni necessarie per elencare le visualizzazioni materializzate in un set di dati:

  • roles/bigquery.user
  • roles/bigquery.metadataViewer
  • roles/bigquery.dataViewer
  • roles/bigquery.dataOwner
  • roles/bigquery.dataEditor
  • roles/bigquery.admin

Per saperne di più sui ruoli e sulle autorizzazioni IAM in IAM, consulta Ruoli e autorizzazioni predefiniti.

La procedura per elencare le viste materializzate è identica a quella per elencare le tabelle. Per elencare le viste materializzate in un set di dati:

Console

  1. Nel riquadro Spazio di esplorazione, espandi il progetto e seleziona un set di dati.

  2. Scorri l'elenco per visualizzare le tabelle nel set di dati. Le tabelle, le visualizzazioni e le visualizzazioni materializzate sono identificate da icone diverse.

    Icone di tabelle e visualizzazioni

bq

Esegui il comando bq ls. Il flag --format può essere utilizzato per controllare l'output. Se elenchi le viste materializzate in un progetto diverso da quello predefinito, aggiungi l'ID progetto al set di dati nel seguente formato: project_id:dataset.

bq ls --format=pretty project_id:dataset

Dove:

  • project_id è l'ID progetto.
  • dataset è il nome del set di dati.

Quando esegui il comando, il campo Type mostra il tipo di tabella. Ad esempio:

+-------------------------+--------------------+----------------------+-------------------+
|         tableId         | Type               |        Labels        | Time Partitioning |
+-------------------------+--------------------+----------------------+-------------------+
| mytable                 | TABLE              | department:shipping  |                   |
| mymatview               | MATERIALIZED_VIEW  |                      |                   |
+-------------------------+--------------------+----------------------+-------------------+

Esempi:

Inserisci il comando seguente per elencare le visualizzazioni materializzate nel set di datimydataset nel tuo progetto predefinito.

bq ls --format=pretty mydataset

Inserisci il seguente comando per elencare le visualizzazioni materializzate nel set di dati mydataset in myotherproject.

bq ls --format=pretty myotherproject:mydataset

API

Per elencare le visualizzazioni materializzate utilizzando l'API, chiama il metodo tables.list.

Vai

Prima di provare questo esempio, segui le istruzioni di configurazione Go riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Go.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/bigquery"
	"google.golang.org/api/iterator"
)

// listTables demonstrates iterating through the collection of tables in a given dataset.
func listTables(w io.Writer, projectID, datasetID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	ts := client.Dataset(datasetID).Tables(ctx)
	for {
		t, err := ts.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return err
		}
		fmt.Fprintf(w, "Table: %q\n", t.TableID)
	}
	return nil
}

Python

Prima di provare questo esempio, segui le istruzioni di configurazione Python riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Python.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set dataset_id to the ID of the dataset that contains
#                  the tables you are listing.
# dataset_id = 'your-project.your_dataset'

tables = client.list_tables(dataset_id)  # Make an API request.

print("Tables contained in '{}':".format(dataset_id))
for table in tables:
    print("{}.{}.{}".format(table.project, table.dataset_id, table.table_id))

Ottenere informazioni sulle viste materializzate

Puoi ottenere informazioni su una vista materializzata utilizzando SQL, lo strumento a riga di comando bq o l'API BigQuery.

Autorizzazioni obbligatorie

Per eseguire query sulle informazioni di una vista materializzata, devi disporre delle seguenti autorizzazioni IAM (Identity and Access Management):

  • bigquery.tables.get
  • bigquery.tables.list
  • bigquery.routines.get
  • bigquery.routines.list

Ciascuno dei seguenti ruoli IAM predefiniti include le autorizzazioni precedenti:

  • roles/bigquery.metadataViewer
  • roles/bigquery.dataViewer
  • roles/bigquery.admin

Per ulteriori informazioni sulle autorizzazioni BigQuery, consulta Controllo dell'accesso con IAM.

Per ottenere informazioni su una vista materializzata, incluse eventuali repliche di viste materializzate dipendenti:

SQL

Per ottenere informazioni sulle viste materializzate, esegui una query sulla vista INFORMATION_SCHEMA.TABLES:

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'editor di query, inserisci la seguente istruzione:

    SELECT * FROM PROJECT_ID.DATASET_ID.INFORMATION_SCHEMA.TABLES
    WHERE table_type = 'MATERIALIZED VIEW';

    Sostituisci quanto segue:

    • PROJECT_ID: il nome del progetto che contiene le viste materializzate
    • DATASET_ID: il nome del set di dati che contiene le viste materializzate

  3. Fai clic su Esegui.

Per ulteriori informazioni su come eseguire query, consulta Eseguire una query interattiva.

bq

Utilizza il comando bq show:

bq show --project=project_id --format=prettyjson dataset.materialized_view

Sostituisci quanto segue:

  • project_id: l'ID progetto. Devi includere questo flag solo per ottenere informazioni su una vista materializzata in un progetto diverso da quello predefinito.
  • dataset: il nome del set di dati che contiene la vista materializzata.
  • materialized_view: il nome della vista materializzata su cui vuoi informazioni.

Esempio:

Inserisci il comando seguente per visualizzare le informazioni sulla vista tabella my_mv nel set di dati report_views nel progetto myproject.

bq show --project=myproject --format=prettyjson report_views.my_mv

API

Per ottenere informazioni vista materializzata utilizzando l'API, chiama il metodo tables.get.

Eliminare le visualizzazioni materializzate

Puoi eliminare una vista materializzata tramite la console Google Cloud, lo strumento a riga di comando bq o l'API.

L'eliminazione di una vista materializzata comporta anche l'eliminazione di tutte le autorizzazioni associate a questa vista. Quando ricrei una vista materializzata eliminata, devi anche riconfigurare manualmente le autorizzazioni di accesso precedentemente associate.

Autorizzazioni obbligatorie

Per eliminare le viste tabelle, devi disporre dell'autorizzazione IAM bigquery.tables.delete.

Ciascuno dei seguenti ruoli IAM predefiniti include le autorizzazioni necessarie per eliminare una vista materializzata:

  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

Per saperne di più su Identity and Access Management (IAM) di BigQuery, consulta Ruoli e autorizzazioni predefiniti.

SQL

Per eliminare una vista materializzata, utilizza l'istruzione DDL DROP MATERIALIZED VIEW:

  1. Nella console Google Cloud, vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nell'editor di query, inserisci la seguente istruzione:

    DROP MATERIALIZED VIEW PROJECT.DATASET.MATERIALIZED_VIEW;

    Sostituisci quanto segue:

    • PROJECT: il nome del progetto che contiene la vista materializzata
    • DATASET: il nome del set di dati che contiene la vista materializzata
    • MATERIALIZED_VIEW: il nome della vista materializzata da eliminare

  3. Fai clic su Esegui.

Per ulteriori informazioni su come eseguire query, consulta Eseguire una query interattiva.

bq

Utilizza il comando bq rm per eliminare la vista materializzata.

API

Chiama il metodo tables.delete e specifica i valori per i parametri projectId, datasetId e tableId:

  • Assegna il parametro projectId all'ID progetto.
  • Assegna il parametro datasetId all'ID del set di dati.
  • Assegna il parametro tableId all'ID tabella della vista materializzata che stai eliminando.

Java

Prima di provare questo esempio, segui le istruzioni di configurazione Java riportate nella guida rapida all'utilizzo di BigQuery con le librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API BigQuery Java.

Per autenticarti in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, consulta Configurare l'autenticazione per le librerie client.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;

// Sample to delete materialized view
public class DeleteMaterializedView {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String materializedViewName = "MY_MATERIALIZED_VIEW_NAME";
    deleteMaterializedView(datasetName, materializedViewName);
  }

  public static void deleteMaterializedView(String datasetName, String materializedViewName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, materializedViewName);

      boolean success = bigquery.delete(tableId);
      if (success) {
        System.out.println("Materialized view deleted successfully");
      } else {
        System.out.println("Materialized view was not found");
      }
    } catch (BigQueryException e) {
      System.out.println("Materialized view was not found. \n" + e.toString());
    }
  }
}

Aggiorna le viste materializzate

L'aggiornamento di una vista materializzata aggiorna i dati memorizzati nella cache della vista in modo da riflettere lo stato corrente delle relative tabelle di base.

Quando esegui una query su una vista materializzata, BigQuery restituisce i risultati sia dei dati della vista materializzata memorizzati nella cache sia dei dati recuperati dalla tabella di base. Ove possibile, BigQuery legge solo le modifiche apportate dall'ultimo aggiornamento della vista. Sebbene i dati sottoposti di recente a streaming potrebbero non essere inclusi durante un aggiornamento della vista materializzata, le query leggono sempre i dati sottoposti a streaming, indipendentemente dall'utilizzo o meno di una vista materializzata.

La restituzione dei risultati della query direttamente dalla tabella di base comporta un costo di calcolo superiore rispetto alla restituzione dei risultati dai dati delle vista materializzata memorizzati nella cache. L'aggiornamento regolare dei dati memorizzati nella cache delle vista materializzata riduce la quantità di dati restituiti direttamente dalla tabella di base, il che riduce il costo di calcolo.

Questa sezione descrive come:

Aggiornamento automatico

Puoi attivare o disattivare l'aggiornamento automatico in qualsiasi momento. Il job di aggiornamento automatico viene eseguito dall'account di servizio bigquery-adminbot@system.gserviceaccount.com e visualizzato nella cronologia dei job del progetto della vista materializzata.

Per impostazione predefinita, i dati memorizzati nella cache in una vista materializzata vengono aggiornati automaticamente dalla tabella di base entro 5-30 minuti da una modifica alla tabella di base, ad esempio inserimenti o eliminazioni di righe.

Puoi impostare la quota limite di frequenza di aggiornamento per gestire la frequenza degli aggiornamenti automatici dei dati memorizzati nella cache e, di conseguenza, i costi e le prestazioni delle query delle visualizzazioni materializzate.

Attivare e disattivare l'aggiornamento automatico

Per disattivare l'aggiornamento automatico quando crei una vista materializzata, imposta enable_refresh su false.

CREATE MATERIALIZED VIEW PROJECT.DATASET.MATERIALIZED_VIEW
PARTITION BY RANGE_BUCKET(column_name, buckets)
OPTIONS (enable_refresh = false)
AS SELECT ...

Per una vista materializzata esistente, puoi modificare il valore enable_refresh utilizzando ALTER MATERIALIZED VIEW.

ALTER MATERIALIZED VIEW PROJECT.DATASET.MATERIALIZED_VIEW
SET OPTIONS (enable_refresh = true);

Imposta la quota limite

Puoi configurare una quota limite per la frequenza con cui viene eseguito l'aggiornamento automatico. Per impostazione predefinita, le viste materializzate vengono aggiornate non più di una volta ogni 30 minuti.

Il limite di frequenza di aggiornamento può essere modificato in qualsiasi momento.

Per impostare una quota limite di aggiornamento quando crei una vista materializzata, imposta refresh_interval_minutes in DDL (o refresh_interval_ms nell'API e nello strumento a riga di comando bq) sul valore che preferisci.

CREATE MATERIALIZED VIEW PROJECT.DATASET.MATERIALIZED_VIEW
OPTIONS (enable_refresh = true, refresh_interval_minutes = 60)
AS SELECT ...

Analogamente, puoi impostare la quota limite quando modifichi una vista materializzata. Questo esempio presuppone che tu abbia già attivato l'aggiornamento automatico e voglia solo modificare la quota limite:

ALTER MATERIALIZED VIEW PROJECT.DATASET.MATERIALIZED_VIEW
SET OPTIONS (refresh_interval_minutes = 60);

La quota limite di frequenza di aggiornamento minima è di 1 minuto. La quota limite di frequenza di aggiornamento è di 7 giorni.

Puoi eseguire un aggiornamento manuale di una vista materializzata in qualsiasi momento e i relativi tempi non sono soggetti alla quota limite.

Best effort

L'aggiornamento automatico viene eseguito secondo il criterio del "best effort". BigQuery tenta di avviare un aggiornamento entro 5 minuti da una modifica nella tabella di base (se l'aggiornamento precedente è stato eseguito prima di 30 minuti), ma non garantisce che l'aggiornamento verrà avviato in quel momento né quando verrà completato.

L'aggiornamento automatico viene trattato in modo simile a una query con priorità batch. Se al momento il progetto della vista materializzata non ha la capacità necessaria, l'aggiornamento viene ritardato. Se il progetto contiene molte visualizzazioni il cui aggiornamento risulta costoso, ogni singola visualizzazione potrebbe avere un ritardo significativo rispetto alle tabelle di base.

Aggiornamento manuale

Puoi aggiornare manualmente una vista materializzata in qualsiasi momento.

Autorizzazioni obbligatorie

Per aggiornare manualmente le visualizzazioni materializzate, devi disporre delle autorizzazioni IAM bigquery.tables.getData, bigquery.tables.update e bigquery.tables.updateData.

Ciascuno dei seguenti ruoli IAM predefiniti include le autorizzazioni necessarie per aggiornare manualmente una vista materializzata:

  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

Per saperne di più su Identity and Access Management (IAM) di BigQuery, consulta Ruoli e autorizzazioni predefiniti.

Per aggiornare i dati nella vista materializzata, chiama la procedura di sistema BQ.REFRESH_MATERIALIZED_VIEW. Quando viene chiamata questa procedura, BigQuery identifica le modifiche apportate alle tabelle di base e le applica alla vista materializzata. La query da eseguireBQ.REFRESH_MATERIALIZED_VIEW termina al termine dell'aggiornamento.

CALL BQ.REFRESH_MATERIALIZED_VIEW('PROJECT.DATASET.MATERIALIZED_VIEW');

Monitorare le viste materializzate

Puoi ottenere informazioni sulle viste materializzate e sui job di aggiornamento delle viste materializzate utilizzando l'API BigQuery. Per ulteriori informazioni, consulta Monitorare le viste materializzate.