BI Engine の概要

BigQuery BI Engine は、頻繁に使用するデータをインテリジェントにキャッシュに保存することで、BigQuery の多くの SQL クエリを高速化する高速メモリ内分析サービスです。BI Engine では、データ可視化ツールにより作成されたものを含む任意のソースからの SQL クエリを高速化し、継続的な最適化に向けてキャッシュ テーブルを管理できます。これにより、手動調整やデータ階層化を行わずに、クエリのパフォーマンスを向上させることができます。テーブルのクラスタリングパーティショニングを行うことで、大規模なテーブルの BI Engine のパフォーマンスをさらに最適化できます。

たとえば、ダッシュボードに直近の四半期のデータのみを表示する場合は、最新のパーティションのみがメモリに読み込まれるように、テーブルを時間でパーティショニングすることができます。また、マテリアライズド ビューと BI Engine のメリットを組み合わせることもできます。これは、マテリアライズド ビューを使用してデータを結合、フラット化して BI Engine の構造を最適化する場合に特に効果的です。

BI Engine には次の利点があります。

  • BigQuery API 互換性: BI Engine は BigQuery API と直接統合されます。BI ソリューションまたは REST ドライバや JDBC/ODBC ドライバなどの標準メカニズムを介して BigQuery API と連携するカスタム アプリケーションは、変更なしで BI Engine を使用できます。
  • ベクトル化されたランタイム: 実行エンジンでベクトル化された処理を使用すると、データのバッチを一度に処理することで、最新の CPU アーキテクチャをより効率的に利用できます。BI Engine ではさらに、高度なデータ エンコード(具体的には、辞書のランレングス圧縮)を使用して、メモリ内レイヤに保存されているデータをさらに圧縮します。
  • シームレスな統合: BI Engine は、承認済みビュー、列レベルのセキュリティ、データ マスキングなど、BigQuery の機能やメタデータと連携します。
  • 予約の割り当て: BI Engine の予約では、各プロジェクトおよびリージョンごとのメモリ割り当てが個別に管理されます。BI Engine により、列とパーティションのクエリされた必要な部分のみがキャッシュに保存されます。優先テーブルを使用して、BI Engine アクセラレーションを使用するテーブルを指定できます。

ほとんどの組織では、BI Engine は BI Engine アクセラレーションの容量を予約する必要のある課金管理者によって有効にされます。詳細については、BI Engine の容量を予約するをご覧ください。

BI Engine のユースケース

BI Engine は、BI ダッシュボードに使用される SQL クエリも含め、多くの SQL クエリを大幅に高速化できます。高速化は、クエリに必要なテーブルを特定し、優先テーブルとしてマークする場合に、特に効果的です。BI Engine を使用するには、リージョンに予約を作成し、そのサイズを指定します。BigQuery では、プロジェクトの使用パターンに基づいてキャッシュに保存するテーブルを決定できます。また、テーブルを指定して、他のトラフィックがその高速化を妨げないようにすることもできます。

BI Engine は、次のユースケースで役立ちます。

  • BI ツールを使用してデータを分析する: BI Engine は、BigQuery コンソール、BI ツール(Looker Studio や Tableau など)、クライアント ライブラリ、API、ODBC コネクタまたは JDBC コネクタなどのいずれかで実行されていても、BigQuery クエリを高速化します。これにより、組み込みの接続(API)やコネクタを介して BigQuery に接続するダッシュボードのパフォーマンスが大幅に向上します。
  • 頻繁にクエリされるテーブルがある場合: BI Engine では、高速化する優先テーブルを指定できます。これは、特に頻繁に照会されるテーブルや、可視性の高いダッシュボードに使用されるテーブルのサブセットがある場合に便利です。

次のような場合には、BI Engine がニーズに合わない可能性があります。

  • クエリでワイルドカードを使用する: ワイルドカード テーブルを参照するクエリは BI Engine でサポートされておらず、高速化のメリットはありません。
  • BI Engine でサポートされていない BigQuery 機能が必要: BI Engine はほとんどの SQL 関数と演算子をサポートしています。ただし、外部テーブル、行レベルのセキュリティ、SQL 以外のユーザー定義関数などは、BI Engine でサポートされていない機能となります。

BI Engine に関する考慮事項

BI Engine の構成方法を決定する際には、次の点を考慮してください。

特定のクエリが必ず高速化されるようにする

クエリセットが確実に高速化されるようにするには、専用の BI Engine 予約を使用して独立したプロジェクトを作成します。まず、クエリに必要なコンピューティング容量を見積もり、それらのテーブルを BI Engine の優先テーブルとして指定します。

結合を最小化する

BI Engine は、事前結合データや事前集計データ、および結合数の少ないクエリで最もうまく機能します。これは、小さいディメンション テーブルと結合された大きなファクト テーブルにクエリする場合など、結合の一方が大きくもう一方がはるかに小さい場合に特に当てはまります。BI Engine をマテリアライズド ビューと組み合わせることができます。このビューでは、結合を実施して 1 つの大規模なフラット テーブルを生成します。これにより、同じ結合がクエリごとに実行されることはありません。クエリのパフォーマンスを最適化するには、古いマテリアライズド ビューを使用することをおすすめします。

BI Engine の影響を把握する

BI Engine の使用量を確認するには、Cloud Monitoring で BI Engine をモニタリングするを参照するか、INFORMATION_SCHEMA.BI_CAPACITIES ビューと INFORMATION_SCHEMA.BI_CAPACITY_CHANGES ビューに対してクエリを実行します。正確な比較を行うために、BigQuery の [キャッシュされた結果を使用] オプションを無効にしておいてください。詳細については、キャッシュに保存されたクエリ結果を使用するをご覧ください。

優先テーブル

BI Engine の優先テーブルを使用すると、BI Engine による高速化を特定のテーブルに限定できます。その他のテーブルに対するクエリには、通常の BigQuery スロットが使用されます。たとえば、優先テーブルを使用すると、ビジネスにとって重要であるとして識別したテーブルとダッシュボードのみを高速化できます。

プロジェクトに、すべての優先テーブルを保持するのに十分な RAM がない場合は、BI Engine が最近アクセスされていないパーティションと列をオフロードします。高速化を必要とする新しいクエリのためにメモリが解放されます。

優先テーブルの制限事項

BI Engine の優先テーブルには次の制限があります。

  • 優先テーブルの予約リストにビューを追加することはできません。BI Engine の優先テーブルは、テーブルのみをサポートします。
  • マテリアライズド ビューへのクエリが高速化されるのは、マテリアライズド ビューとそのベーステーブルの両方が優先テーブルリストに含まれている場合のみです。
  • 高速化用のパーティションまたは列の指定はサポートされていません。
  • JSON 型の列はサポートされていないため、BI Engine によって高速化されません。
  • 複数のテーブルにアクセスするクエリが高速化されるのは、すべてのテーブルが優先テーブルである場合のみです。たとえば、JOIN を含むクエリ内のすべてのテーブルは、高速化するために優先テーブルリストに含まれている必要があります。優先リストに含まれていないテーブルが 1 つであっても、クエリで BI Engine を使用することはできません。
  • 一般公開データセットは、Google Cloud コンソールではサポートされていません。一般公開テーブルを優先テーブルとして追加するには、API または DDL を使用します。

制限事項

BigQuery BI Engine には次の制限があります。

結合

BI Engine は、特定のタイプの結合クエリを高速化します。高速化は、INNERLEFT OUTER JOINS を使用するリーフレベルのサブクエリで実行されます。ここで、大規模なファクト テーブルが、最大で 4 つの小規模な「ディメンション」テーブルと結合されます。小規模なディメンション テーブルには次の制限があります。

  • 500 万行未満
  • サイズ制限:
    • パーティション分割されていないテーブル: 5 GiB 以下
    • パーティション分割テーブル: 参照されるパーティションが 1 GB 以下

ウィンドウ関数

分析関数とも呼ばれるウィンドウ関数は、BigQuery BI Engine で高速化される際に次の制限があります。

  • 入力ステージにウィンドウ関数がない場合は、BigQuery BI Engine によって高速化されます。この場合、INFORMATION_SCHEMA.JOBS ビューは bi_engine_statistics.acceleration_modeFULL_INPUT として報告します。
  • 入力ステージにウィンドウ関数を含むクエリの入力ステージは BI Engine によって高速化されます。ただし、BI Engine のウィンドウ関数の制限事項に記載されている制限は適用されません。その場合、入力ステージまたはクエリ全体が BI Engine で実行されます。この場合、INFORMATION_SCHEMA.JOBS ビューは bi_engine_statistics.acceleration_modeFULL_INPUT または FULL_QUERY として報告します。

BiEngineStatistics フィールドの詳細については、ジョブ参照をご覧ください。

BI Engine のウィンドウ関数の制限事項

ウィンドウ関数を使用したクエリは、次のすべての条件が満たされている場合にのみ BI Engine で実行されます。

  • クエリが 1 つのテーブルのみをスキャンする。
    • テーブルが分割されていない。
    • テーブルの行数が 500 万行未満。
  • クエリに JOIN 演算子が含まれていない。
  • スキャンされるテーブルのサイズにウィンドウ関数演算子の数を掛けた結果が 300 MiB を超えない。

同じ OVER 句と同じ直接入力を持つ 2 つのウィンドウ関数は同じウィンドウ関数演算子を共有できます。例:

  • SELECT ROW_NUMBER() OVER (ORDER BY x), SUM(x) OVER (ORDER BY x) FROM my_table には、ウィンドウ関数演算子が 1 つしかない。
  • SELECT ROW_NUMBER() OVER (ORDER BY x), SUM(x) OVER (PARTITION BY y ORDER BY x) FROM my_table には 2 つの関数に異なる OVER 句が含まれているため、2 つのウィンドウ関数演算子がある。
  • SELECT ROW_NUMBER() OVER (ORDER BY x) FROM (SELECT SUM(x) OVER (ORDER BY x) AS x FROM my_table) は 2 つの関数の OVER 句は同じだが、直接入力が異なるため、2 つのウィンドウ関数演算子がある。

サポートされているウィンドウ関数

次の参照ウィンドウ関数がサポートされています。

  • ANY_VALUE
  • AVG
  • BIT_AND
  • BIT_OR
  • BIT_XOR
  • CORR
  • COUNT
  • COUNTIF
  • COVAR_POP
  • COVAR_SAMP
  • CUME_DIST
  • DENSE_RANK
  • FIRST_VALUE
  • LAG
  • LAST_VALUE
  • LEAD
  • LOGICAL_AND
  • LOGICAL_OR
  • MAX
  • MIN
  • NTH_VALUE
  • NTILE
  • PERCENT_RANK
  • PERCENTILE_CONT
  • PERCENTILE_DISC
  • RANK
  • ROW_NUMBER
  • ST_CLUSTERDBSCAN
  • STDDEV_POP
  • STDDEV_SAMP
  • STDDEV
  • STRING_AGG
  • SUM
  • VAR_POP
  • VAR_SAMP
  • VARIANCE

ウィンドウ関数がサポートされていない場合は、次のようなエラーが表示されることがあります。

分析関数が他の演算子と互換性がないか、入力が大きすぎます

BI Engine のその他の制限事項

BI Engine による高速化は、次の機能では使用できません。

  • JavaScript UDF
  • 外部テーブル(BigLake テーブルを含む)
  • JSON データのクエリ - エラー メッセージ: JSON ネイティブ型はサポートされていません
  • BigQuery 永続テーブルへの結果の書き込み
  • BigQuery 変更データ キャプチャを使用する upsert を含むテーブル
  • トランザクション
  • 1 GiB を超えるデータを返すクエリ。レイテンシの影響を受けやすいアプリケーションの場合、レスポンス サイズを 1 MiB 未満にすることをおすすめします。
  • 行レベルのセキュリティ

機能がサポートされていない場合の回避策

一部の SQL 機能は BigQuery BI Engine でサポートされていませんが、次の回避策があります。

  1. BigQuery でクエリを記述する。
  2. クエリの結果をテーブルに保存する。
  3. クエリをスケジューリングして、テーブルを定期的に更新する。1 時間ごとまたは 1 日ごとの更新頻度が最適です。1 分ごとに更新すると、更新頻度が高すぎてキャッシュが無効になるおそれがあります。
  4. パフォーマンスが重要なクエリでこのテーブルを参照する。

割り当てと上限

BI Engine に適用される割り当てと上限については、BigQuery の割り当てと上限をご覧ください。

料金

BI Engine の容量用に作成した予約に対して費用が発生します。BI Engine の料金の詳細については、BigQuery の料金ページをご覧ください。

次のステップ