管理物化视图

本文档介绍了如何在 BigQuery 中管理物化视图。

BigQuery 管理物化视图包括以下操作:

如需详细了解物化视图,请参阅以下内容:

准备工作

授予为用户提供执行本文档中的每个任务所需权限的 Identity and Access Management (IAM) 角色。执行任务所需的权限(如果有)列出在任务的“所需权限”部分中。

更改物化视图

您可以通过 Google Cloud 控制台更改物化视图,也可以通过将数据定义语言 (DDL) 与 ALTER MATERIALIZED VIEWSET OPTIONS 搭配使用来通过 bq 命令行工具进行更改。如需查看物化视图选项列表,请参阅 materialized_view_set_options_list

下面展示了一个将 enable_refresh 设置为 true 的示例。根据您的用例按需进行调整。

所需权限

如需更改物化视图,您需要拥有 bigquery.tables.getbigquery.tables.update IAM 权限。

以下每个预定义 IAM 角色都包含更改物化视图所需的权限:

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

如需详细了解 BigQuery Identity and Access Management (IAM),请参阅预定义角色和权限

SQL

如需更改物化视图,请使用 ALTER MATERIALIZED VIEW SET OPTIONS DDL 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

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

    替换以下内容:

    • PROJECT:包含物化视图的项目的名称
    • DATASET:包含物化视图的数据集的名称
    • MATERIALIZED_VIEW:要更改的物化视图的名称

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

bq

运行 bq update 命令:

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

Java

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

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

列出物化视图

您可以通过 Google Cloud 控制台、bq 命令行工具或 BigQuery API 列出物化视图。

所需权限

如需列出数据集中的物化视图,您需要拥有 bigquery.tables.list IAM 权限。

以下每个预定义 IAM 角色都包含列出数据集中的物化视图所需的权限:

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

如需详细了解 IAM 中的 IAM 角色和权限,请参阅预定义的角色和权限

列出物化视图的过程与列出表的过程完全相同。如需列出数据集中的物化视图,请执行以下操作:

控制台

  1. 浏览器面板中,展开您的项目并选择数据集。

  2. 滚动列表,查看数据集中的表。表、视图和物化视图由不同的图标进行标识。

    表和视图图标

bq

发出 bq ls 命令。--format 标志可用于控制输出。如果您要列出非默认项目中的物化视图,请按照以下格式将项目 ID 添加到数据集:project_id:dataset

bq ls --format=pretty project_id:dataset

其中:

  • project_id 是您的项目 ID。
  • dataset 是数据集的名称。

运行该命令时,Type 字段会显示表类型。例如:

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

示例:

输入以下命令可列出默认项目的数据集 mydataset 中的物化视图。

bq ls --format=pretty mydataset

输入以下命令可列出 myotherproject 的数据集 mydataset 中的物化视图。

bq ls --format=pretty myotherproject:mydataset

API

如需使用 API 列出物化视图,请调用 tables.list 方法。

Go

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。 如需了解详情,请参阅 BigQuery Go API 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

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

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证


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

获取有关物化视图的信息

您可以使用 SQL、bq 命令行工具或 BigQuery API 获取物化视图的相关信息。

所需权限

如需查询有关物化视图的信息,您需要拥有以下 Identity and Access Management (IAM) 权限:

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

以下每个预定义的 IAM 角色均可提供上述权限:

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

如需详细了解 BigQuery 权限,请参阅使用 IAM 进行访问权限控制

如需获取有关物化视图的信息,包括任何依赖的物化视图副本,请执行以下操作:

SQL

如需获取有关物化视图的信息,请查询 INFORMATION_SCHEMA.TABLES 视图

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

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

    请替换以下内容:

    • PROJECT_ID:包含物化视图的项目的名称
    • DATASET_ID:包含物化视图的数据集的名称

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

bq

使用 bq show 命令

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

替换以下内容:

  • project_id:项目 ID。 您只需添加此标志,即可获取与默认项目不同的其他项目中物化视图的相关信息。
  • dataset:包含物化视图的数据集的名称。
  • materialized_view:您要获取相关信息的物化视图的名称。

示例:

输入以下命令,可显示 myproject 项目的 report_views 数据集中的物化视图 my_mv 的相关信息。

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

API

如需使用 API 获取物化视图信息,请调用 tables.get 方法。

删除物化视图

您可以通过 Google Cloud 控制台、bq 命令行工具或 API 删除物化视图。

删除物化视图也会删除与此物化视图关联的所有权限。重新创建已删除的物化视图时,您还必须手动重新配置之前与其关联的任何访问权限

所需权限

如需删除物化视图,您需要拥有 bigquery.tables.delete IAM 权限。

以下每个预定义 IAM 角色都包含删除物化视图所需的权限:

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

如需详细了解 BigQuery Identity and Access Management (IAM),请参阅预定义角色和权限

SQL

如需删除物化视图,请使用 DROP MATERIALIZED VIEW DDL 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    DROP MATERIALIZED VIEW PROJECT.DATASET.MATERIALIZED_VIEW;

    替换以下内容:

    • PROJECT:包含物化视图的项目的名称
    • DATASET:包含物化视图的数据集的名称
    • MATERIALIZED_VIEW:要删除的物化视图的名称

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

bq

使用 bq rm 命令删除物化视图。

API

调用 tables.delete 方法并为 projectIddatasetIdtableId 参数指定值:

  • 为项目 ID 分配 projectId 参数。
  • 为数据集 ID 分配 datasetId 参数。
  • 为要删除的物化视图的表 ID 分配 tableId 参数。

Java

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档

如需向 BigQuery 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

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

刷新物化视图

刷新物化视图会更新该视图的缓存数据,以反映其基表的当前状态。

当您查询物化视图时,BigQuery 会返回缓存的物化视图数据和从基表检索的数据的结果。如果可能,BigQuery 仅读取自从上次刷新视图以来所做的更改。虽然在刷新物化视图期间可能不会包含最近流式传输的数据,但无论是否使用了物化视图,查询都会始终读取流式传输的数据。

直接从基表返回查询结果所产生的计算费用,要高于从缓存的物化视图数据返回结果所产生的计算费用。定期刷新物化视图缓存的数据可减少直接从基表返回的数据量,从而降低计算费用。

本部分介绍了如何执行以下操作:

自动刷新

您可以随时启用或停用自动刷新。自动刷新作业由 bigquery-adminbot@system.gserviceaccount.com 服务账号执行,并显示在物化视图项目的作业历史记录中。

默认情况下,物化视图中缓存的数据会在更改基表(例如插入或删除行)后的 5 到 30 分钟内从基表自动刷新。

您可以设置刷新频率上限,以管理缓存数据的自动刷新频率,从而管理物化视图的费用和查询性能。

启用和停用自动刷新

如需在创建物化视图时停用自动刷新功能,请将 enable_refresh 设置为 false

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

对于现有物化视图,您可以使用 ALTER MATERIALIZED VIEW 修改 enable_refresh 值。

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

设置频率上限

您可以对自动刷新运行频率配置频率上限。默认情况下,物化视图的刷新频率不超过每 30 分钟刷新一次。

您可以随时更改刷新频率上限。

如需在创建物化视图时设置刷新频率上限,请将 DDL 中的 refresh_interval_minutes(或 API 和 bq 命令行工具中的 refresh_interval_ms)设置为所需的值。

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

同样,您可以在修改物化视图时设置频率上限。此示例假定您已启用自动刷新,但只想更改频率上限:

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

刷新频率最小上限为 1 分钟。刷新频率最大上限为 7 天。

您可以随时手动刷新物化视图,其时间不受频率上限的约束。

尽力而为

系统会尽最大努力执行自动刷新。BigQuery 会尝试在基表更改后的 5 分钟内开始刷新(如果上一次刷新是在 30 分钟之前执行的),但无法保证刷新操作会在这个时间开始,也无法保证其完成时间。

自动刷新的处理方式与具有批量优先级的查询类似。如果物化视图的项目当前没有容量,则刷新会延迟。如果项目包含多个最终证明其刷新开销较大的视图,则每个视图可能会相对于其基表出现显著延迟。

手动刷新

您可以随时手动刷新物化视图。

所需权限

如需手动刷新物化视图,您需要拥有 bigquery.tables.getDatabigquery.tables.updatebigquery.tables.updateData IAM 权限。

以下预定义的 IAM 角色均包含手动刷新物化视图所需的权限:

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

如需详细了解 BigQuery Identity and Access Management (IAM),请参阅预定义角色和权限

如需更新物化视图中的数据,请调用 BQ.REFRESH_MATERIALIZED_VIEW 系统过程。调用此过程后,BigQuery 会识别在基表中发生的更改并将这些更改应用到物化视图。刷新完成后,对运行 BQ.REFRESH_MATERIALIZED_VIEW 的查询也将完成。

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

监控物化视图

您可以使用 BigQuery API 获取有关物化视图和物化视图刷新作业的信息。 如需了解详情,请参阅监控物化视图