マテリアライズド ビューを管理する

このドキュメントでは、BigQuery でマテリアライズド ビューを管理する方法について説明します。

マテリアライズド ビューの BigQuery での管理には、次のオペレーションが含まれます。

マテリアライズド ビューの詳細については、以下をご覧ください。

始める前に

このドキュメントの各タスクを実行するために必要な権限をユーザーに与える Identity and Access Management(IAM)のロールを付与します。タスクの実行に必要な権限(存在する場合)は、タスクの「必要な権限」セクションに記載されています。

マテリアライズド ビューを変更する

マテリアライズド ビューは、Google Cloud コンソールまたは bq コマンドライン ツールから、ALTER MATERIALIZED VIEWSET OPTIONS を指定したデータ定義言語(DDL)を使用することで変更できます。マテリアライズド ビュー オプションの一覧については、materialized_view_set_options_list をご覧ください。

次の例では、enable_refreshtrue に設定しています。必要に応じて、ユースケースに合わせて調整してください。

必要な権限

マテリアライズド ビューを変更するには、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 のロールと権限については、事前定義ロールと権限をご覧ください。

マテリアライズド ビューを一覧表示するプロセスは、テーブルを一覧表示するプロセスと同じです。データセット内のマテリアライズド ビューをリストするには:

コンソール

  1. [エクスプローラ] パネルでプロジェクトを開いて、データセットを選択します。

  2. リストをスクロールして、データセット内のテーブルを表示します。テーブル、ビュー、マテリアライズド ビューは、別々のアイコンで区別できます。

    テーブルとビューのアイコン

bq

bq ls コマンドを発行します。--format フラグを使用して出力を制御できます。デフォルト プロジェクト以外のプロジェクトにあるマテリアライズド ビューを一覧表示する場合は、project_id:dataset の形式でプロジェクト ID をデータセットに追加します。

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 パラメータの値を指定します。

  • 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_refreshfalse に設定します。

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 を使用して取得できます。詳細については、マテリアライズド ビューのモニタリングをご覧ください。