Gérer les vues matérialisées

Ce document explique comment gérer les vues matérialisées dans BigQuery.

La gestion BigQuery des vues matérialisées comprend les opérations suivantes :

Pour en savoir plus sur les vues matérialisées, consultez les pages suivantes :

Avant de commencer

Attribuez aux utilisateurs des rôles IAM (Identity and Access Management) incluant les autorisations nécessaires pour effectuer l'ensemble des tâches du présent document. Les autorisations requises pour effectuer une tâche (le cas échéant) sont répertoriées dans la section "Autorisations requises" de la tâche.

Modifier les vues matérialisées

Vous pouvez modifier une vue matérialisée via la console Google Cloud ou l'outil de ligne de commande bq, à l'aide du langage de définition de données (LDD) avec ALTER MATERIALIZED VIEW et SET OPTIONS. Pour obtenir la liste des options des vues matérialisées, consultez materialized_view_set_options_list.

Voici un exemple où enable_refresh est défini sur true. Adaptez-le à votre cas d'utilisation, le cas échéant.

Autorisations requises

Pour modifier les vues matérialisées, vous avez besoin des autorisations IAM bigquery.tables.get et bigquery.tables.update.

Chacun des rôles IAM prédéfinis suivants inclut les autorisations dont vous avez besoin pour modifier une vue matérialisée :

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

Pour en savoir plus sur BigQuery Identity and Access Management (IAM), consultez la page Rôles et autorisations prédéfinis.

SQL

Pour modifier une vue matérialisée, utilisez l'instruction LDD ALTER MATERIALIZED VIEW SET OPTIONS :

  1. Dans la console Google Cloud, accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, saisissez l'instruction suivante :

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

    Remplacez les éléments suivants :

    • PROJECT : nom du projet contenant la vue matérialisée
    • DATASET : nom de l'ensemble de données contenant la vue matérialisée
    • MATERIALIZED_VIEW : nom de la vue matérialisée que vous souhaitez modifier

  3. Cliquez sur Exécuter.

Pour en savoir plus sur l'exécution des requêtes, consultez Exécuter une requête interactive.

bq

Exécutez la commande bq update :

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

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

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());
    }
  }
}

Répertorier les vues matérialisées

Vous pouvez répertorier des vues matérialisées via la console Google Cloud, l'outil de ligne de commande bq ou l'API BigQuery.

Autorisations requises

Pour répertorier les vues matérialisées d'un ensemble de données, vous devez disposer de l'autorisation IAM bigquery.tables.list.

Chacun des rôles IAM prédéfinis suivants inclut les autorisations dont vous avez besoin pour répertorier les vues matérialisées d'un ensemble de données :

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

Pour en savoir plus sur les rôles et les autorisations IAM dans IAM, consultez la page Rôles prédéfinis et autorisations.

Le processus permettant de répertorier les vues matérialisées est identique à celui utilisé pour répertorier les tables. Pour répertorier les vues matérialisées dans un ensemble de données :

Console

  1. Dans le panneau Explorateur, développez votre projet et sélectionnez un ensemble de données.

  2. Faites défiler la liste pour voir les tables de l'ensemble de données. Les tables, les vues et les vues matérialisées sont identifiées par des icônes différentes.

    Icône table et vue

bq

Exécutez la commande bq ls. L'option --format peut être utilisée pour contrôler le résultat. Si vous répertoriez des vues matérialisées dans un projet autre que votre projet par défaut, ajoutez l'ID du projet à l'ensemble de données, en respectant le format suivant : project_id:dataset.

bq ls --format=pretty project_id:dataset

Où :

  • project_id est l'ID de votre projet.
  • dataset est le nom de l'ensemble de données.

Lorsque vous exécutez la commande, le champ Type affiche le type de table. Exemple :

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

Exemples :

Saisissez la commande suivante pour répertorier les vues matérialisées de l'ensemble de données mydataset dans votre projet par défaut.

bq ls --format=pretty mydataset

Saisissez la commande suivante pour répertorier les vues matérialisées de l'ensemble de données mydataset dans myotherproject.

bq ls --format=pretty myotherproject:mydataset

API

Pour répertorier les vues matérialisées à l'aide de l'API, appelez la méthode tables.list.

Go

Avant d'essayer cet exemple, suivez les instructions de configuration pour Go du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Go.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

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

Avant d'essayer cet exemple, suivez les instructions de configuration pour Python du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Python.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.


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

Obtenir des informations sur les vues matérialisées

Vous pouvez obtenir des informations sur une vue matérialisée à l'aide de SQL, de l'outil de ligne de commande bq ou de l'API BigQuery.

Autorisations requises

Pour interroger des informations sur une vue matérialisée, vous devez disposer des autorisations IAM (Identity and Access Management) suivantes :

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

Chacun des rôles IAM prédéfinis suivants inclut les autorisations ci-dessus :

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

Pour plus d'informations sur les autorisations BigQuery, consultez la page Contrôle des accès avec IAM.

Pour obtenir des informations sur une vue matérialisée, y compris les éventuelles instances dupliquées de vues matérialisées dépendantes, procédez comme suit :

SQL

Pour obtenir des informations sur les vues matérialisées, interrogez la vue INFORMATION_SCHEMA.TABLES :

  1. Dans la console Google Cloud, accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, saisissez l'instruction suivante :

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

    Remplacez les éléments suivants :

    • PROJECT_ID : nom du projet contenant les vues matérialisées
    • DATASET_ID : nom de l'ensemble de données contenant les vues matérialisées

  3. Cliquez sur Exécuter.

Pour en savoir plus sur l'exécution des requêtes, consultez Exécuter une requête interactive.

bq

Exécutez la commande bq show :

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

Remplacez les éléments suivants :

  • project_id : ID du projet. Il vous suffit d'inclure cette option pour obtenir des informations sur une vue matérialisée dans un projet différent du projet par défaut.
  • dataset : nom de l'ensemble de données contenant la vue matérialisée.
  • materialized_view : nom de la vue matérialisée pour laquelle vous souhaitez obtenir des informations.

Exemple :

Saisissez la commande suivante pour afficher des informations sur la vue matérialisée my_mv dans l'ensemble de données report_views du projet myproject.

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

API

Pour obtenir des informations sur les vues matérialisées à l'aide de l'API, appelez la méthode tables.get.

Supprimer les vues matérialisées

Vous pouvez supprimer une vue matérialisée à l'aide de la console Google Cloud, de l'outil de ligne de commande bq ou de l'API.

La suppression d'une vue matérialisée supprime également toutes les autorisations associées à cette vue matérialisée. Lorsque vous recréez une vue matérialisée supprimée, vous devez également reconfigurer manuellement les autorisations d'accès qui lui sont associées.

Autorisations requises

Pour créer des vues matérialisées, vous devez disposer de l'autorisation IAM bigquery.tables.delete.

Chacun des rôles IAM prédéfinis suivants inclut les autorisations dont vous avez besoin pour supprimer une vue matérialisée :

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

Pour en savoir plus sur BigQuery Identity and Access Management (IAM), consultez la page Rôles et autorisations prédéfinis.

SQL

Pour supprimer une vue matérialisée, utilisez l'instruction LDD DROP MATERIALIZED VIEW :

  1. Dans la console Google Cloud, accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans l'éditeur de requête, saisissez l'instruction suivante :

    DROP MATERIALIZED VIEW PROJECT.DATASET.MATERIALIZED_VIEW;

    Remplacez les éléments suivants :

    • PROJECT : nom du projet contenant la vue matérialisée
    • DATASET : nom de l'ensemble de données contenant la vue matérialisée
    • MATERIALIZED_VIEW : nom de la vue matérialisée que vous souhaitez supprimer

  3. Cliquez sur Exécuter.

Pour en savoir plus sur l'exécution des requêtes, consultez Exécuter une requête interactive.

bq

Utilisez la commande bq rm pour supprimer la vue matérialisée.

API

Appelez la méthode tables.delete et spécifiez les valeurs des paramètres projectId, datasetId et tableId :

  • Attribuez le paramètre projectId à l'ID de votre projet.
  • Attribuez le paramètre datasetId à l'ID de votre ensemble de données.
  • Attribuez le paramètre tableId à l'ID de la table de la vue matérialisée que vous supprimez.

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

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());
    }
  }
}

Actualiser les vues matérialisées

L'actualisation d'une vue matérialisée met à jour les données mises en cache pour refléter l'état actuel de ses tables de base.

Lorsque vous interrogez une vue matérialisée, BigQuery renvoie les résultats à la fois des données de la vue matérialisée mise en cache et des données récupérées à partir de la table de base. Dans la mesure du possible, BigQuery ne lit que les modifications depuis la dernière actualisation de la vue. Bien que les données récemment diffusées puissent ne pas être incluses lors d'une actualisation de la vue matérialisée, les requêtes lisent toujours les données diffusées, qu'une vue matérialisée soit utilisée ou non.

Le renvoi des résultats de requête directement à partir de la table de base entraîne des coûts de calcul plus élevés que le renvoi des résultats à partir des données de vue matérialisée mises en cache. Actualiser régulièrement les données mises en cache de la vue matérialisée réduit la quantité de données renvoyées directement à partir de la table de base, ce qui réduit les coûts de calcul.

Cette page explique comment effectuer les opérations suivantes :

Actualisation automatique

Vous pouvez activer ou désactiver l'actualisation automatique à tout moment. La tâche d'actualisation automatique est effectuée par le compte de service bigquery-adminbot@system.gserviceaccount.com et apparaît dans l'historique des tâches du projet de vue matérialisée.

Par défaut, les données mises en cache dans une vue matérialisée sont automatiquement actualisées à partir de la table de base dans un délai de cinq à 30 minutes après une modification apportée à la table de base, par exemple, l'insertion ou la suppression de lignes.

Vous pouvez définir la limite de fréquence d'actualisation pour gérer la fréquence des actualisations automatiques des données mises en cache, et ainsi gérer les coûts et les performances des requêtes des vues matérialisées.

Activer et désactiver l'actualisation automatique

Pour désactiver l'actualisation automatique lorsque vous créez une vue matérialisée, définissez enable_refresh sur false.

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

Pour une vue matérialisée existante, vous pouvez modifier la valeur enable_refresh à l'aide de ALTER MATERIALIZED VIEW.

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

Définir la limite de fréquence

Vous pouvez configurer une limite de fréquence pour l'actualisation automatique. Par défaut, les vues matérialisées ne sont pas actualisées plus d'une fois toutes les 30 minutes.

La limite de fréquence d'actualisation peut être modifiée à tout moment.

Pour définir une limite de fréquence d'actualisation lorsque vous créez une vue matérialisée, définissez refresh_interval_minutes dans l'instruction LDD (ou refresh_interval_ms dans l'API et l'outil de ligne de commande bq) sur la valeur que vous souhaitez.

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

De même, vous pouvez définir la limite de fréquence lorsque vous modifiez une vue matérialisée. Dans cet exemple, nous partons du principe que vous avez déjà activé l'actualisation automatique et que vous souhaitez juste modifier la limitation de fréquence:

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

La limite minimale de fréquence d'actualisation est d'une minute. La limite maximale de fréquence d'actualisation est de sept jours.

La limite de fréquence ne s'applique pas à l'actualisation manuelle. Vous pouvez donc actualiser manuellement une vue matérialisée à tout moment.

Optimisation limitée

L'actualisation automatique est effectuée de la manière la plus optimale possible. BigQuery tente de lancer une actualisation dans les cinq minutes suivant une modification de la table de base (si l'actualisation précédente a été effectuée il y a plus de 30 minutes), mais ne garantit pas que l'actualisation démarrera à ce moment-là, ni le moment précis de l'exécution de l'opération

L'actualisation automatique est traitée de la même manière qu'une requête avec par lot en priorité. Si le projet de la vue matérialisée n'a pas la capacité pour l'instant, l'actualisation est retardée. Si le projet contient de nombreuses vues dont l'actualisation est coûteuse, chaque vue peut être considérablement retardée par rapport à ses tables de base.

Actualisation manuelle

Vous pouvez actualiser manuellement une vue matérialisée à tout moment.

Autorisations requises

Pour actualiser manuellement les vues matérialisées, vous devez disposer des autorisations IAM bigquery.tables.getData, bigquery.tables.update et bigquery.tables.updateData.

Chacun des rôles IAM prédéfinis suivants inclut les autorisations dont vous avez besoin pour actualiser manuellement une vue matérialisée :

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

Pour en savoir plus sur BigQuery Identity and Access Management (IAM), consultez la page Rôles et autorisations prédéfinis.

Pour mettre à jour les données dans la vue matérialisée, appelez la procédure système BQ.REFRESH_MATERIALIZED_VIEW. Lorsque cette procédure est appelée, BigQuery identifie les modifications apportées aux tables de base et les applique à la vue matérialisée. La requête à exécuter BQ.REFRESH_MATERIALIZED_VIEW se termine une fois l'actualisation terminée.

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

Surveiller les vues matérialisées

Vous pouvez obtenir des informations sur les vues matérialisées et les tâches d'actualisation de vues matérialisées à l'aide de l'API BigQuery. Pour en savoir plus, consultez la section Surveiller les vues matérialisées.