管理具體化檢視表

本文件說明如何在 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 身分與存取權管理 (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. 按一下 「Run」

如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」一文。

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

輸入下列指令,即可列出 myotherprojectmydataset 資料集的實體化檢視畫面。

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. 按一下 「Run」

如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」一文。

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 身分與存取權管理 (IAM),請參閱「預先定義的角色和權限」一文。

SQL

如要刪除具體化檢視表,請使用 DROP MATERIALIZED VIEW DDL 陳述式

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往 BigQuery

  2. 在查詢編輯器中輸入以下陳述式:

    DROP MATERIALIZED VIEW PROJECT.DATASET.MATERIALIZED_VIEW;

    請依指示取代下列項目:

    • PROJECT:包含實體化檢視表的專案名稱
    • DATASET:包含實體化檢視表的資料集名稱
    • MATERIALIZED_VIEW:要刪除的物化檢視表名稱

  3. 按一下 「Run」

如要進一步瞭解如何執行查詢,請參閱「執行互動式查詢」一文。

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

對於現有的實體化檢視畫面,您可以使用 ALTER MATERIALIZED VIEW 修改 enable_refresh 值。

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

設定展示頻率上限

您可以設定自動重新整理的頻率上限。根據預設,materialized view 的更新頻率不會超過每 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 分鐘前完成),但無法保證會在該時間開始重新整理,也無法保證何時會完成。

自動重新整理的處理方式與使用 batch 優先順序的查詢類似。如果實體化檢視畫面的專案目前沒有足夠的容量,則會延遲重新整理。如果專案包含許多需要大量重新整理的檢視畫面,每個個別檢視畫面可能會相對於其基礎資料表出現明顯的延遲。

手動重新整理

您隨時可以手動重新整理已實體化的檢視畫面。

所需權限

如要手動重新整理具體化檢視表,您必須具備 bigquery.tables.getDatabigquery.tables.updatebigquery.tables.updateData IAM 權限。

下列每個預先定義的 IAM 角色都包含手動重新整理已實例化檢視區塊所需的權限:

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

如要進一步瞭解 BigQuery 身分與存取權管理 (IAM),請參閱「預先定義的角色和權限」一文。

如要更新具體化檢視表中的資料,請呼叫 BQ.REFRESH_MATERIALIZED_VIEW 系統程序。呼叫此程序時,BigQuery 會找出基礎資料表中發生的變更,並將這些變更套用至物化檢視畫面。重新整理完成後,要執行的查詢 BQ.REFRESH_MATERIALIZED_VIEW 就會結束。

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

監控具體化檢視表

您可以使用 BigQuery API 取得具體化檢視表和具體化檢視表重新整理工作相關資訊。詳情請參閱「監控已實體化的檢視畫面」。