実体化されたビューのよくある質問

このページでは、BigQuery のマテリアライズド ビューに関するよくある質問の回答を紹介します。

スケジュールされたクエリとマテリアライズド ビューを使用するのはどのような場合ですか?

スケジュールされたクエリは、複雑な計算を何かしらの形で定期的に実行する際に便利です。クエリは、実行されるたびに完全に実行されます。前の結果は使用されず、クエリの使用料金の全額が請求されます。最新のデータを必要とせず、データが未更新であることが問題にならない場合は、スケジュールされたクエリが最適です。

マテリアライズド ビューは、以前に計算された結果を再利用してレイテンシとコストを削減しつつ、最新のデータをクエリする必要がある場合に適しています。マテリアライズド ビューを疑似インデックスとして使用して、既存のワークフローを更新せずにベーステーブルに対するクエリを高速化できます。

一般的なガイドラインとして、可能な限り、また、複雑な計算を何かしらの形で実行しない場合は、マテリアライズド ビューを使用してください。

マテリアライズド ビューのクエリが行われた場合、基本テーブルの変更は、どの程度の速度で反映されますか?

すぐに反映されます。ベーステーブルへのストリーミング、ベーステーブルへのデータの一括読み込み、ベーステーブルに結果を書き込むクエリの実行など、クエリを実行するとすぐに新しいテーブルの状態が反映されます。これは、ベーステーブルに対してマテリアライズド ビューをクエリする、またはベーステーブルを直接クエリするいずれの場合でも適用され、実行プランはマテリアライズド ビューを利用します。

マテリアライズド ビューはどのくらいの頻度で更新されますか?

ベーステーブルが変更されると、各マテリアライズド ビューは自動更新(再計算)されますが、システム定義の間隔(現在は 30 分)より短い頻度になることはありません。また、自動更新を設定するか、強制的に手動で更新することにより更新頻度を制御することもできます。自動更新は、マテリアライズド ビューに相当するものをアプリケーション レベルで手動で管理するよりも効率的で、エラーが発生しにくくなります。更新の詳細については、マテリアライズド ビューの管理をご覧ください。

マテリアライズド ビューを使用するように、オプティマイザーによってクエリが書き換えられたかどうかを確認するにはどうすればよいですか?

クエリプランを調べます。マテリアライズド ビューを使用するように BigQuery によってクエリが書き換えられた場合、クエリプランには READ my_mv_table ステップが含められます。ここで、my_mv_table はクエリの書き換えによって使用されるマテリアライズド ビューの名前です。

UI を使用して、マテリアライズド ビューを管理するにはどうすればよいですか?

マテリアライズド ビューは、Cloud Console の [データセット] ページに表示されます。たとえば、以下にマテリアライズド ビューのスキーマがどのように表示されるかを示します。

Google Cloud Console のマテリアライズド ビューのスキーマ

特定のクエリに対してクエリの書き換えを無効にするにはどうすればよいですか?

BigQuery クエリ オプティマイザーは、マテリアライズド ビューを使用するようにクエリを自動的に書き換えます。クエリの書き換えを無効にする理由の 1 つは、マテリアライズド ビューがあるクエリとないクエリの間で結果やパフォーマンスを比較するためです。

クエリの書き換えを無効にするには、ベーステーブルに対するクエリに "WHERE RAND()<1" フィルタを追加します。RAND() は非決定論的関数であるため、クエリは書き換えられません。RAND()<1 は常に true と評価されるため、クエリ結果には影響しません。

クエリによって、マテリアライズド ビューの自動更新がトリガーされますか?

いいえ。マテリアライズド ビューの自動更新はトリガーされません。

これらのエラーが発生するのはなぜですか?

一般的なエラーの詳細は次のとおりです。

エラー: 「マテリアライズド ビューのクエリにサポートされていない機能が含まれています」

このエラーは、マテリアライズド ビューの作成時に発生することがあります。次のような原因が考えられます。

  • クエリに HAVING 句が含まれている。

    -- Results in an error
    SELECT date, COUNT(event) count FROM base_table GROUP BY date HAVING count >= 100
    
  • クエリに集計関数を基盤とする計算が含まれています。

    -- Results in an error
    SELECT date, ROUND(SUM(net_paid)) as sum_paid FROM base_table GROUP BY date
    

マテリアライズド ビューには、必要な集計関数のみを含め、HAVING 句を使用しないでください。事後フィルタリングと事後計算は、具体化されたビューの上に配置する必要があります。たとえば、論理ビューを作成する場合は、次のようになります。

CREATE MATERIALIZED VIEW my_dataset.my_mv AS
SELECT date, SUM(net_paid) sum_paid
FROM my_project.my_dataset.my_base_table
GROUP BY date

CREATE VIEW my_dataset.my_view AS
SELECT date, ROUND(sum_paid) sum_paid
FROM my_project.my_dataset.my_mv
WHERE sum_paid > 10.0

-- Now you can query the regular view
SELECT ... FROM my_dataset.my_view

エラー: 「内部エラーが発生してリクエストを完了できません」

このエラーは、マテリアライズド ビューの作成時に発生することがあります。このエラーの一般的な理由は、特定の集計関数(AVGARRAY_AGGAPPROX_COUNT_DISTINCT など)の上位にある事後計算にあります。

エラーが発生するステートメントの例:

-- Results in an error
CREATE MATERIALIZED VIEW my_dataset.my_mv AS
SELECT ROUND(AVG(x)) avg_x,
  ARRAY_AGG(x ORDER BY z LIMIT 1)[OFFSET(0)] top_x,
    APPROX_COUNT_DISTINCT(x) * 10 approx_cnt_x
FROM my_project.my_dataset.my_table

代わりに、[OFFSET(0)] をマテリアライズド ビューの最上部の通常のビューに移動します。

CREATE MATERIALIZED VIEW my_dataset.my_mv AS
SELECT AVG(x) avg_x,
  ARRAY_AGG(x ORDER BY z LIMIT 1) top_x_arr,
  APPROX_COUNT_DISTINCT(x) approx_cnt_x
FROM my_project.my_dataset.my_table

CREATE VIEW my_dataset.my_view AS
SELECT ROUND(avg_x) as avg_x,
  top_x_arr[OFFSET(0)] as top_x,
  approx_cnt_x * 10 as approx_cnt_x
FROM my_project.my_dataset.my_mv

-- Now you can query the regular view
SELECT ... FROM my_dataset.my_view