管理具体化视图

本文档介绍了如何在 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 仅读取自从上次刷新视图以来所做的更改。虽然在刷新具体化视图期间可能不会包含最近流式传输的数据,但无论是否使用了具体化视图,查询都会始终读取流式传输的数据。本部分介绍了如何执行以下操作:

自动刷新

默认情况下,具体化视图会在更改基表后的 5 分钟内自动刷新,但频率不能超过每 30 分钟一次。更改示例包括行插入或行删除。

您可以使用刷新频率上限来管理具体化视图的费用和查询性能。无论刷新上限是多少,具体化视图始终会返回最新数据。

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

启用和停用自动刷新

如需在创建表时停用自动刷新,请将 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 获取有关具体化视图和具体化视图刷新作业的信息。 如需了解详情,请参阅监控具体化视图