管理具體化檢視表

本文說明如何在 BigQuery 中管理具體化檢視表。

BigQuery 具體化檢視表管理作業包括:

如要進一步瞭解具體化檢視區塊,請參閱下列資源:

事前準備

授予身分與存取權管理 (IAM) 角色,讓使用者取得執行本文各項工作所需的權限。執行工作所需的權限 (如有) 會列在工作「必要權限」部分。

修改具體化檢視表

您可以透過 Google Cloud 主控台或 bq 指令列工具,使用資料定義語言 (DDL) 和 ALTER MATERIALIZED VIEWSET OPTIONS 變更具體化檢視區塊。如需具體化檢視表選項清單,請參閱 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 角色都包含在資料集中列出具體化檢視區塊所需的權限:

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

如要進一步瞭解 IAM 中的 IAM 角色和權限,請參閱預先定義的角色和權限

列出具體化檢視區的程序與列出資料表的程序相同。如要列出資料集中的具體化檢視表:

主控台

  1. 在「Explorer」面板中展開專案並選取資料集。

  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,取得具體化檢視區塊的相關資訊。

所需權限

如要查詢具體化檢視區塊的相關資訊,您必須具備下列身分與存取權管理 (IAM) 權限:

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

下列每個預先定義的 IAM 角色都包含上述權限:

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

如要進一步瞭解 BigQuery 權限,請參閱「使用身分與存取權管理功能控管存取權」一文。

如要取得具體化檢視表的相關資訊,包括任何依附的具體化檢視表副本,請按照下列步驟操作:

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 角色都包含刪除具體化檢視區塊所需的權限:

  • 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 參數指定值:

  • projectId 參數指派給專案 ID。
  • datasetId 參數指派給資料集 ID。
  • tableId 參數指派給要刪除的具體化檢視表資料表 ID。

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

如要修改現有實體化檢視區塊的 enable_refresh 值,請使用 ALTER MATERIALIZED VIEW

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 天。

您可以隨時手動重新整理具體化檢視表,且時間不受頻率上限限制。

盡可能提供最佳服務

系統會盡力自動重新整理。 如果基礎資料表在 30 分鐘內發生變更,BigQuery 會嘗試在 5 分鐘內開始重新整理,但無法保證會在該時間開始重新整理,也無法保證何時會完成。

自動重新整理的處理方式與批次優先順序的查詢類似。如果具體化檢視區塊的專案目前沒有容量,系統會延後重新整理。如果專案包含許多重新整理成本很高的檢視區塊,每個檢視區塊相對於其基本資料表,可能會大幅延遲。

手動重新整理

您隨時可以手動重新整理具體化檢視區塊。

所需權限

如要手動重新整理具體化檢視表,您需要 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 取得具體化檢視表和具體化檢視表重新整理工作的相關資訊。詳情請參閱「監控具體化檢視區塊」。