Administra vistas materializadas

En este documento, se describe cómo administrar vistas materializadas en BigQuery.

La administración de BigQuery de las vistas materializadas incluye las siguientes operaciones:

Para obtener más información sobre las vistas materializadas, consulta lo siguiente:

Antes de comenzar

Otorga funciones de la Identity and Access Management (IAM) que les brindan a los usuarios los permisos necesarios para realizar cada tarea de este documento. Los permisos necesarios para realizar una tarea (si existen) se enumeran en la sección “Permisos necesarios” de la tarea.

Alterar vistas materializadas

Puedes modificar una vista materializada a través de la consola de Google Cloud o la herramienta de línea de comandos de bq con el lenguaje de definición de datos (DDL) a través de ALTER MATERIALIZED VIEW y SET OPTIONS Para obtener una lista de las opciones de vista materializada, consulta materialized_view_set_options_list.

A continuación, se muestra un ejemplo que establece enable_refresh en true. Realiza los ajustes necesarios para tu caso práctico.

Permisos necesarios

Para modificar las vistas materializadas, necesitas los permisos bigquery.tables.get y bigquery.tables.update de IAM.

Cada uno de los siguientes roles predefinidos de IAM incluye los permisos que necesitas para alterar una vista materializada:

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

Para obtener más información sobre la Identity and Access Management (IAM) de BigQuery, consulta Roles y permisos predefinidos.

SQL

Para modificar una vista materializada, usa la declaración DDL ALTER MATERIALIZED VIEW SET OPTIONS:

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, escribe la siguiente oración:

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

    Reemplaza lo siguiente:

    • PROJECT: el nombre del proyecto que contiene la vista materializada
    • DATASET: el nombre del conjunto de datos que contiene la vista materializada
    • MATERIALIZED_VIEW: el nombre de la vista materializada que deseas modificar

  3. Haz clic en Ejecutar.

Si deseas obtener información sobre cómo ejecutar consultas, visita Ejecuta una consulta interactiva.

bq

Ejecuta el comando bq update:

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

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Enumera vistas materializadas

Puedes enumerar las vistas materializadas a través de la consola de Google Cloud, la herramienta de línea de comandos de o la API de BigQuery.

Permisos necesarios

Para mostrar las vistas materializadas en un conjunto de datos, necesitas el permiso bigquery.tables.list de IAM.

Cada una de los siguientes roles predefinidos de IAM incluye los permisos que necesitas para mostrar las vistas materializadas en un conjunto de datos:

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

Para obtener más información sobre los roles y los permisos de IAM, consulta Roles y permisos predefinidos.

El proceso para enumerar vistas materializadas es idéntico al proceso con el que se enumeran tablas. Para mostrar una lista de las vistas materializadas de un conjunto de datos, sigue estos pasos:

Consola

  1. En el panel Explorador, expande tu proyecto y selecciona un conjunto de datos.

  2. Desplázate por la lista para ver las tablas en el conjunto de datos. Las tablas, las vistas y las vistas materializadas se identifican a través de íconos diferentes.

    Íconos de tabla y vista

bq

Ejecuta el comando bq ls. Se puede usar la marca --format para controlar el resultado. Si enumeras vistas materializadas en un proyecto que no es el predeterminado, agrega el ID del proyecto al conjunto de datos en el siguiente formato: project_id:dataset.

bq ls --format=pretty project_id:dataset

Aquí:

  • project_id es el ID del proyecto.
  • dataset es el nombre del conjunto de datos.

Cuando ejecutas el comando, el campo Type muestra el tipo de tabla. Por ejemplo:

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

Ejemplos:

Ingresa el siguiente comando para enumerar las vistas materializadas en el conjunto de datos mydataset en tu proyecto predeterminado.

bq ls --format=pretty mydataset

Ingresa el siguiente comando para enumerar las vistas materializadas en el conjunto de datos mydataset en myotherproject.

bq ls --format=pretty myotherproject:mydataset

API

Para mostrar una lista de las vistas materializadas con la API, llama al método tables.list.

Go

Antes de probar este ejemplo, sigue las instrucciones de configuración para Go incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Go.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Antes de probar este ejemplo, sigue las instrucciones de configuración para Python incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Python.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.


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

Obtén información sobre las vistas materializadas

Puedes obtener información sobre una vista materializada con SQL, la herramienta de línea de comandos de bq o la API de BigQuery.

Permisos necesarios

Para consultar información sobre una vista materializada, necesitas los siguientes permisos de Identity and Access Management (IAM):

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

Cada uno de los siguientes roles predefinidos de IAM incluye los permisos anteriores:

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

Para obtener más información sobre IAM de BigQuery, consulta Control de acceso con IAM.

Para obtener información sobre una vista materializada, incluidas las réplicas de vista materializada dependientes, sigue estos pasos:

SQL

Para obtener información sobre las vistas materializadas, consulta la vista INFORMATION_SCHEMA.TABLES:

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, escribe la siguiente oración:

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

    Reemplaza lo siguiente:

    • PROJECT_ID: Es el nombre del proyecto que contiene las vistas materializadas
    • DATASET_ID: Es el nombre del conjunto de datos que contiene las vistas materializadas

  3. Haz clic en Ejecutar.

Si deseas obtener información sobre cómo ejecutar consultas, visita Ejecuta una consulta interactiva.

bq

Usa el comando bq show:

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

Reemplaza lo siguiente:

  • project_id: El ID del proyecto. Solo debes incluir esta marca para obtener información sobre una vista materializada en un proyecto diferente del proyecto predeterminado.
  • dataset: el nombre del conjunto de datos que contiene la vista materializada.
  • materialized_view: el nombre de la vista materializada sobre la que deseas obtener información.

Ejemplo:

Ingresa el siguiente comando para mostrar información sobre la vista materializada my_mv en el conjunto de datos report_views del proyecto myproject.

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

API

Para obtener información de la vista materializada con la API, llama al método tables.get.

Borra vistas materializadas

Puedes borrar una vista materializada a través de la consola de Google Cloud, la herramienta de línea de comandos de o la API.

Si borras una vista materializada, también se borrarán los permisos asociados a ella. Cuando vuelves a crear una vista materializada que se borró, también debes volver a configurar manualmente cualquier permiso de acceso previamente asociado.

Permisos necesarios

Para crear vistas materializadas, necesitas el permiso bigquery.tables.delete de IAM.

Cada uno de los siguientes roles predefinidos de IAM incluye los permisos que necesitas para borrar una vista materializada:

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

Para obtener más información sobre la Identity and Access Management (IAM) de BigQuery, consulta Roles y permisos predefinidos.

SQL

Para borrar una vista materializada, usa la declaración DDL DROP MATERIALIZED VIEW:

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a BigQuery

  2. En el editor de consultas, escribe la siguiente oración:

    DROP MATERIALIZED VIEW PROJECT.DATASET.MATERIALIZED_VIEW;

    Reemplaza lo siguiente:

    • PROJECT: el nombre del proyecto que contiene la vista materializada
    • DATASET: el nombre del conjunto de datos que contiene la vista materializada
    • MATERIALIZED_VIEW: el nombre de la vista materializada que deseas borrar

  3. Haz clic en Ejecutar.

Si deseas obtener información sobre cómo ejecutar consultas, visita Ejecuta una consulta interactiva.

bq

Usa el comando bq rm para borrar la vista materializada.

API

Llama al método tables.delete y especifica los valores para los parámetros projectId, datasetId y tableId:

  • Asigna el parámetro projectId al ID de tu proyecto.
  • Asigna el parámetro datasetId al ID de tu conjunto de datos.
  • Asigna el parámetro tableId al ID de la tabla de la vista materializada que borrarás.

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Actualiza vistas materializadas

La actualización de una vista materializada actualiza los resultados almacenados en caché de la vista para reflejar el estado actual de las tablas base. Cuando es posible, BigQuery solo lee los cambios desde la última vez que se actualizó la vista. Si bien es posible que los datos transmitidos recientemente no se incluyan durante una actualización de la vista materializada, las consultas siempre leen los datos transmitidos, sin importar si se usa una vista materializada. En esta sección, se describe cómo hacer lo siguiente:

Actualización automática

De forma predeterminada, las vistas materializadas se actualizan automáticamente en un plazo de 5 minutos desde que se hace un cambio en las tablas base, pero no con mayor frecuencia que cada 30 minutos. Algunos ejemplos de cambios son las inserciones o eliminaciones de filas.

Puedes usar la limitación de frecuencia de actualización para administrar los costos y el rendimiento de las consultas de las vistas materializadas. Sin importar el límite de actualización, las vistas materializadas siempre muestran datos recientes.

La actualización automática se puede habilitar o inhabilitar en cualquier momento. La cuenta de servicio bigquery-adminbot@system.gserviceaccount.com realiza el trabajo de actualización automática y aparece en el historial de trabajos del proyecto de vista materializada.

Habilita e inhabilita la actualización automática

Para desactivar la actualización automática cuando creas una tabla, configura enable_refresh como false.

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

Para una vista materializada existente, puedes modificar el valor enable_refresh con ALTER MATERIALIZED VIEW.

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

Configura la limitación de frecuencia

Puedes configurar una limitación de la frecuencia con la que se ejecuta la actualización automática. De forma predeterminada, las vistas materializadas se actualizan con una frecuencia de no más de 30 minutos.

La limitación de frecuencia de actualización se puede cambiar en cualquier momento.

Para establecer un límite de frecuencia de actualización cuando creas una vista materializada, configura refresh_interval_minutes en DDL (o refresh_interval_ms en la API y en la herramienta de línea de comandos de ) en el valor en cuestión.

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

De manera similar, puedes establecer la limitación de frecuencia cuando modificas una tabla. En este ejemplo, se supone que ya habilitaste la actualización automática y solo deseas cambiar la limitación de frecuencia:

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

El límite mínimo de frecuencia de actualización es de 1 minuto. El límite máximo de frecuencia de actualización es de 7 días.

Puedes realizar una actualización manual de una vista materializada en cualquier momento, y su duración no está sujeta a la limitación de frecuencia.

Mejor esfuerzo.

La actualización automática se realiza según el criterio del mejor esfuerzo. BigQuery intenta iniciar una actualización dentro de los 5 minutos posteriores a un cambio en la tabla base (si la actualización anterior se realizó antes de 30 minutos), pero no garantiza que la actualización desde que comenzó en ese momento y tampoco garantiza cuándo se completará.

La actualización automática se trata de manera similar a una consulta con prioridad por lotes. Si el proyecto de la vista materializada no tiene la capacidad en este momento, la actualización se retrasa. Si el proyecto contiene muchas vistas cuya actualización resulta ser costosa, es posible que cada vista individual se retrase de forma considerable en relación con sus tablas base.

Actualización manual

Puedes actualizar manualmente una vista materializada en cualquier momento.

Permisos necesarios

Para actualizar de forma manual las vistas materializadas, necesitas los permisos de IAM bigquery.tables.getData, bigquery.tables.update y bigquery.tables.updateData.

Cada uno de los siguientes roles predefinidos de IAM incluye los permisos que necesitas para actualizar de forma manual una vista materializada:

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

Para obtener más información sobre la Identity and Access Management (IAM) de BigQuery, consulta Roles y permisos predefinidos.

Para actualizar los datos en la vista materializada, llama al procedimiento del sistema BQ.REFRESH_MATERIALIZED_VIEW. Cuando se invoca este procedimiento, BigQuery identifica los cambios que tuvieron lugar en las tablas base y los aplica en la vista materializada. La consulta para ejecutar BQ.REFRESH_MATERIALIZED_VIEW finaliza cuando se completa la actualización.

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

Supervisa las vistas materializadas

Puedes obtener información sobre vistas materializadas y trabajos de actualización actualizados con la API de BigQuery. Para obtener más información, consulta Supervisa vistas materializadas.