マテリアライズド ビューの概要

このドキュメントでは、BigQuery でのマテリアライズド ビューのサポートの概要について説明します。このドキュメントを読む前に、BigQuery と BigQuery の標準ビューについて理解しておいてください。

概要

BigQuery のマテリアライズド ビューは事前に計算されたビューで、パフォーマンスと効率を向上させるためにクエリの結果を定期的にキャッシュに保存します。BigQuery は、事前に計算されたマテリアライズド ビューの結果を利用し、可能な場合にはベーステーブルからの差分のみを読み取って最新の結果を計算します。マテリアライズド ビューに直接クエリを発行できるのはもちろん、ベーステーブルに対するクエリを処理するために BigQuery オプティマイザーでマテリアライズド ビューを使用することもできます。

マテリアライズド ビューを使用したクエリは通常、同じデータをベーステーブルのみから取得するクエリよりも高速で、消費するリソースも少なくて済みます。マテリアライズド ビューを使用すると、よく使うクエリを何度も繰り返し使用するような特性を持つワークロードのパフォーマンスを大幅に向上させることができます。

マテリアライズド ビューを使用すべき場合

BigQuery のマテリアライズド ビューには、次のようなメリットがあります。

  • 集計関数を含むクエリの実行時間の短縮とコストの低減。最大のメリットが得られるのは、クエリの計算コストが高く、返されるデータセットが小さい場合です。生のテーブルがあり、膨大な処理を要するオンライン分析処理(OLAP)スタイルの集計を行う場合に、抽出、変換、読み込み(ETL)やビジネス インテリジェンス(BI)パイプラインなどの予測可能で反復的なクエリがあるときは、マテリアライズド ビューを使用することをおすすめします。

  • BigQuery クエリを自動的かつ透過的に最適化。可能であれば、BigQuery オプティマイザーはマテリアライズド ビューを使用して、クエリ実行プランを改善します。この最適化のおかげで、クエリを変更する必要はありません。

  • リアルタイム データの集計。リアルタイムでデータにアクセスして意思決定する場合は、BigQuery マテリアライズド ビューと BigQuery ストリーミングを使用すると、集計をリアルタイムで実行し、最新の情報を取得できます。

必要な権限

マテリアライズド ビューの操作に必要な権限については、マテリアライズド ビューの操作に必要な権限をご覧ください。

他の BigQuery 技術との比較

次の表に、BigQuery のキャッシュ、スケジュールされたクエリ、標準ビュー、マテリアライズド ビューの類似点と相違点をまとめます。

コンポーネント キャッシュ スケジュールされたクエリ 標準ビュー マテリアライズド ビュー
パフォーマンス × ×
サポートされるクエリ すべて すべて すべて 集計 - フィルタリングとグループ化
パーティショニングとクラスタリング × 該当なし
増分更新 × × ×
追加の保存 × ×
クエリの書き換え × × ×
メンテナンス費用 × 該当なし
データ未更新 なし なし なし
1 つのテーブルに制限 × × ×

他の BigQuery 機能との連携

次の BigQuery の機能は、BigQuery マテリアライズド ビューに対して透過的に機能します。

  • クエリプランの説明: クエリプランには、スキャンされたマテリアライズド ビュー(存在する場合)が反映され、マテリアライズド ビューとそのベーステーブルから読み取られたバイト数が示されます。

  • クエリのキャッシュ: マテリアライズド ビューを使用して書き換えられたクエリの結果は、通常の制限(確定関数の使用、ベーステーブルへのストリーミングなし、など)の下でキャッシュに保存できます。

  • コスト計算: オンデマンド課金では、1 つ以上のマテリアライズド ビューを使用してクエリが書き換えられた結果、ベーステーブル全体をスキャンするよりもスキャンするバイト数が少なくなった場合、クエリの費用は低減します。

  • コスト制限: 課金バイト数の上限を設定していて、クエリによって読み取られたバイト数がその上限を超えた場合は、そのクエリで使用されていたのがマテリアライズド ビュー、ベーステーブル、またはその両方かにかかわらず、クエリは課金されずに失敗します。

  • ドライランによるコストの見積もり: ドライランは、使用可能なマテリアライズド ビューを使用してクエリ書き換えロジックを繰り返し、コストを正確に見積もります。この機能は、特定のクエリでマテリアライズド ビューが使用されているかどうかを確認するために使用できます。

制限事項

  • マテリアライズド ビューを直接操作すること、またはマテリアライズド ビューから生の内容を読み取ることはできません。つまり、次の操作はサポートされていません。

    • マテリアライズド ビューを、コピージョブのコピー元またはコピー先としてコピーすること
    • マテリアライズド ビューのエクスポート
    • マテリアライズド ビューへのデータの読み込み
    • マテリアライズド ビューへのクエリ結果の書き込み
    • マテリアライズド ビューに対する DML ステートメントの実行
  • マテリアライズド ビューは、ベーステーブルと同じ組織に存在する必要があります。プロジェクトが組織に属していない場合は、同じプロジェクト内に存在する必要があります。

  • 各ベーステーブルは、同じデータセットから最大 20 個のマテリアライズド ビュー、同じプロジェクトから最大 100 個のマテリアライズド ビュー、組織全体から最大 500 個のマテリアライズド ビューを参照できます。

  • クエリの自動書き換え(またはスマートな調整)では、同じデータセットのマテリアライズド ビューのみが考慮されます。

  • マテリアライズド ビューは、制限付き SQL 構文と一部の集計関数を使用します。詳細については、サポートされているマテリアライズド ビューをご覧ください。

  • マテリアライズド ビューでは 1 つのテーブルのみを参照でき、結合は使用できません。

  • マテリアライズド ビューを他のマテリアライズド ビューにネストすることはできません。

  • マテリアライズド ビューには標準 SQL 言語のみを使用できます。

  • SHOW DDL ステートメントは、マテリアライズド ビューではサポートされていません。

  • ALTER DDL ステートメント(SET OPTIONS 付きの ALTER を除く)は、マテリアライズド ビューではサポートされていません。

  • 先にマテリアライズド ビューを削除せずにベーステーブルを削除した場合、マテリアライズド ビューに対するクエリは失敗し、更新も失敗します。ベーステーブルを再作成する場合は、マテリアライズド ビューも再作成する必要があります。

  • パーティション分割テーブルの上にマテリアライズド ビューが作成された後、テーブルのパーティションの有効期限を変更することはできません。ベーステーブルのパーティションの有効期限を変更するには、まず、パーティション分割テーブルに基づいてすべてのマテリアライズド ビューを削除する必要があります。

  • マテリアライズド ビューで ARRAY_AGG ステートメントと JOIN ステートメントを使用する場合は、いくつかの制限があります。詳細については、ARRAY_AGG に関する考慮事項JOIN に関する考慮事項をご覧ください。

マテリアライズド ビューの料金

BigQuery マテリアライズド ビューで次の操作を行うと費用が発生します。

  • マテリアライズド ビューに対するクエリ。
  • マテリアライズド ビューのメンテナンス(マテリアライズド ビューの更新時など)。
  • マテリアライズド ビュー テーブルの保存。
コンポーネント オンデマンド料金 定額料金
クエリ マテリアライズド ビューとベーステーブルの必要な部分によって処理されたバイト数。1 スロットはクエリの実行中に消費されます。
メンテナンス 更新時に処理されたバイト数。 スロットは更新時に使用されます。
ストレージ マテリアライズド ビューに保存されているバイト数。 マテリアライズド ビューに保存されているバイト数。

1 ベーステーブルが追記専用の場合、マテリアライズド ビューの最後の更新以降の差分のみがベーステーブルから処理されます。詳細については、増分更新をご覧ください。

保存料金の詳細

マテリアライズド ビューの AVGARRAY_AGGAPPROX_COUNT_DISTINCT の各集計値は、最終的な値が直接保存されるわけではありません。その代わりに、最終的な値を生成するための中間的な「スケッチ」として、BigQuery の内部にマテリアライズド ビューが保存されます。

例として、次のコマンドで作成されたマテリアライズド ビューについて考えてみます。

CREATE MATERIALIZED VIEW project-id.my_dataset.my_mv_table AS
SELECT date, AVG(net_paid) AS avg_paid
FROM project-id.my_dataset.my_base_table
GROUP BY date

avg_paid 列は NUMERIC または FLOAT64 としてユーザーに表示されますが、内部的には BYTES として保存され、その内容は独自形式の中間的なスケッチになります。データサイズの計算で、列は BYTES として扱われます。

次のステップ