グローバル クエリ

グローバル クエリを使用すると、複数のリージョンに保存されているデータを参照する SQL クエリを実行できます。 たとえば、us-central1 にあるテーブルと europe-central2にあるテーブルを結合するグローバルクエリを実行できます。このドキュメントでは、プロジェクトでグローバル クエリを有効にして実行する方法について説明します。

始める前に

プロジェクトでグローバル クエリが有効になっていることを確認し、グローバル クエリを実行するために必要な権限があることを確認します。

グローバル クエリを有効にする

プロジェクトまたは組織でグローバル クエリを有効にするには、 ALTER PROJECT SET OPTIONS ステートメント または ALTER ORGANIZATION SET OPTIONS ステートメント を使用して、デフォルト構成を変更します。

  • リージョンでグローバル クエリを実行するには、クエリを実行している プロジェクトのそのリージョンで、enable_global_queries_execution 引数を true に設定します。
  • グローバル クエリがリージョンからデータをコピーできるようにするには、データを含む プロジェクトのそのリージョンで、enable_global_queries_data_access 引数を true に設定します。
  • クエリがリモートテーブルにアクセスするたびに、これらのオプションがチェックされます。
  • グローバル クエリは 1 つのプロジェクトで実行し、別のプロジェクトの他のリージョンからデータを取得できます。

例: クロス プロジェクト構成

次の例は、別のプロジェクトのテーブルにアクセスするクエリを 1 つのプロジェクトで実行する方法を示しています。

us-central1 リージョンでジョブを実行する query_project プロジェクトがあり、europe-west1 リージョンにあるテーブル data_project.dataset.my_table にアクセスするクエリを実行するとします。

SET @@location='us-central1';
SELECT
  *
FROM
  `query_project.dataset.my_table`
  JOIN `data_project.dataset.my_other_table` USING id;

このグローバル クエリを正常に実行するには、次の構成が必要です。

  1. グローバル クエリを実行するリージョン(us-central1)のプロジェクト(query_project)で、グローバル クエリの実行を有効にする必要があります。

    ALTER PROJECT `query_project`
    SET OPTIONS (
    `region-us-central1.enable_global_queries_execution` = TRUE
    );
  2. グローバル クエリがデータを含むプロジェクト(data_project)からそのリージョン(europe-west1)のデータをコピーできるようにする必要があります。

    ALTER PROJECT `data_project`
    SET OPTIONS (
    `region-europe-west1.enable_global_queries_data_access` = TRUE
    );

リモートテーブルを含むビューを作成して使用する場合も、同じ原則が適用されます。クエリを実行するプロジェクトでenable_global_queries_executionが有効になっている必要があります。

これらの ALTER PROJECT オペレーションは、異なるプロジェクトとリージョンを参照するため、個別に実行する必要があります。 変更が有効になるまで数分かかることがあります。

必要な権限

グローバル クエリを実行するには、bigquery.jobs.createGlobalQuery 権限が必要です。 この権限を含む事前定義ロールは、BigQuery 管理者ロールのみです。BigQuery 管理者ロールを付与せずにグローバル クエリを実行する権限を付与するには、次の手順を行います。

  1. カスタムロール(「BigQuery グローバル クエリ実行者」など)を作成します。
  2. このロールに bigquery.jobs.createGlobalQuery を追加します。
  3. このロールを選択したユーザーまたはサービス アカウントに割り当てます。

データのクエリ

グローバル クエリを実行するには、データが 1 つのロケーションにある場合と同じように SQL クエリを作成します。クエリで参照されるデータが複数のロケーションに保存されている場合、BigQuery はグローバル クエリを実行しようとします。BigQuery は、クエリのロケーションを 自動的に選択する場合があります。それ以外の場合は、クエリを実行するロケーションを指定する必要があります。選択したロケーションにないクエリで参照されるデータは、そのロケーションにコピーされます。

次の例では、2 つの異なるロケーションに保存されている 2 つの異なるデータセットのテーブルを結合するグローバル クエリとして実行されます。

SELECT id, tr_date, product_id, price FROM us_dataset.transactions
UNION ALL
SELECT id, tr_date, product_id, price FROM europe_dataset.transactions

自動ロケーション選択

次の場合、クエリを実行するロケーションは 自動的に決定され、変更できません。

  • データ変更言語クエリ(INSERTUPDATEDELETE ステートメント)は、常にターゲット テーブルのロケーションで実行されます。
  • CREATE TABLE AS SELECT ステートメントなどのデータ定義言語クエリは、リソースが作成または変更されるロケーションで常に実行されます。
  • 宛先テーブルが指定された クエリは、宛先テーブルがあるロケーションで常に実行されます。

ロケーションを選択してください

通常、グローバル クエリを実行する場所を決定します。決定する際は、次の点を考慮してください。

  • グローバル クエリは、データをあるロケーションから別のロケーションに一時的にコピーします。組織にデータ所在地の要件があり、ロケーション A のデータをロケーション A から移動させたくない場合は、クエリのロケーションを A に設定します。

  • ロケーション間で転送されるデータ量を最小限に抑え、クエリの費用を削減するには、クエリ対象データのほとんどが保存されているリージョンでクエリを実行します。

オンライン ショップがあり、商品のリストをロケーション us-central1 に保存し、トランザクションを us-south1 リージョンに保存しているとします。カタログ内の商品よりもトランザクションが多い場合は、us-south1 リージョンでクエリを実行する必要があります。

グローバル クエリについて

グローバル クエリを効率的かつ費用対効果の高い方法で実行するには、その実行の仕組みを理解することが 重要です。

異なるロケーションにあるデータを使用するには、1 つの ロケーションにレプリケートする必要があります。以下は、BigQuery によって実行されるグローバル クエリ ワークフローの抽象化です。

  1. ユーザーの宣言または自動的に、クエリを実行する場所を決定します。このロケーションはプライマリ ロケーションと呼ばれ、クエリで参照される他のすべてのロケーションはリモートです。
  2. 各リモート リージョンでサブクエリを実行して、プライマリ リージョンでクエリを完了するために必要なデータを収集します。
  3. このデータをリモート ロケーションからプライマリ ロケーションにコピーします。
  4. データをプライマリ ロケーションの一時テーブルに 8 時間保存します。
  5. プライマリ ロケーションで収集されたすべてのデータを使用して、最終的なクエリを実行します。
  6. クエリ結果を返します。

BigQuery は、リージョン間で転送されるデータ量を最小限に抑えようとします。 たとえば次のようになります。

SET @@location = 'EU';
SELECT
  t1.col1, t2.col2
FROM
  eu_dataset.table1 t1
  JOIN us_dataset.table2 t2 using col3
WHERE
  t2.col4 = 'ABC'

BigQuery は、テーブル t2 のすべてを米国から EU にレプリケートする必要はありません。 リクエストされた列(col2 および col3) と、WHERE 条件(t2.col4 = 'ABC')に一致する行のみを転送すれば十分です。 ただし、プッシュダウンと呼ばれるこれらのメカニズムはクエリ構造に依存するため、 転送されるデータ量が大きくなることがあります。 データの小さなサブセットでグローバル クエリをテストし、必要な場合にのみデータが転送されることを確認することをおすすめします。

オブザーバビリティ

リモート リージョンに送信されたクエリテキストを確認するには、ジョブ履歴を確認します。リモート ジョブのジョブ ID は、元のクエリと同じですが、_xregion サフィックスが追加されています。

グローバル クエリを無効にする

プロジェクトまたは組織でグローバル クエリを無効にするには、 ALTER PROJECT SET OPTIONS statement または ALTER ORGANIZATION SET OPTIONS statement を使用して、デフォルト構成を変更します。

  • リージョンでグローバル クエリを無効にするには、そのリージョンで enable_global_queries_execution 引数を false または NULL に設定します。
  • グローバル クエリがリージョンからデータをコピーできないようにするには、そのリージョンで enable_global_queries_data_access 引数を false または NULL に設定します。

次の例は、プロジェクト レベルでグローバル クエリを無効にする方法を示しています。

ALTER PROJECT PROJECT_ID
SET OPTIONS (
  `region-REGION.enable_global_queries_execution` = false,
  `region-REGION.enable_global_queries_data_access` = false
);

次のように置き換えます。

  • PROJECT_ID: 変更するプロジェクトの名前
  • REGION: グローバル クエリを無効にするリージョンの名前

変更が有効になるまで数分かかることがあります。

料金

グローバル クエリの費用は、次の要素で構成されます。

割り当て

グローバル クエリに関する割り当てについては、クエリジョブをご覧ください。

制限事項

  • クエリの実行の詳細実行グラフには、リモート ロケーションから処理および転送されたバイト数は表示されません。この情報は、ジョブ履歴にあるコピー ジョブに表示されます。グローバル クエリによって作成されたコピー ジョブのジョブ ID には、クエリジョブのジョブ ID が接頭辞として付加されます。
  • グローバル クエリはサンドボックス モードではサポートされていません
  • グローバル クエリは、リージョン間のデータ転送に必要な時間のため、単一リージョン クエリよりもレイテンシが高くなります。
  • グローバル クエリは、リージョン間のデータ転送を回避するためにキャッシュを使用しません。
  • グローバル クエリでは、_PARTITIONTIME などの疑似列に対してクエリを実行できません。
  • グローバル クエリでは、柔軟な列名を使用して列に対してクエリを実行できません。
  • グローバル クエリでは、リモート リージョンから INFORMATION_SCHEMA ビューに対してクエリを実行できません。
  • グローバル クエリでは、リモート リージョンから BigLake メタストア Apache Iceberg テーブルに対してクエリを実行できません。
  • WHERE 句で BigLake テーブルの列を参照する場合、RANGE リテラルまたは INTERVAL リテラルは使用できません。
  • グローバル承認済みビュー承認済みルーティンはサポートされていません(あるロケーションのビューまたはルーティンが別のロケーションのデータセットにアクセスすることを承認されている場合)。
  • グローバル クエリに対するマテリアライズド ビューはサポートされていません。
  • グローバル クエリが STRUCT 列を参照している場合、リモート サブクエリにプッシュダウンは適用されません。パフォーマンスを最適化するには、リモート リージョンに STRUCT 列をフィルタして必要なフィールドのみを個別の列として返すビューを作成することを検討してください。
  • グローバル クエリはアトミックに実行されません。データ レプリケーションが成功しても、クエリ全体が失敗した場合でも、データ レプリケーションの料金は請求されます。
  • グローバル クエリの実行の一部としてリモート リージョンに作成された一時テーブル は、グローバル クエリの結果を暗号化するように構成された CMEK 鍵 (テーブル、データセット、プロジェクト レベル)がグローバルである場合にのみ、顧客管理の暗号鍵(CMEK) を使用して暗号化されます。リモート一時テーブルが常に CMEK で保護されるようにするには、リモート リージョンでグローバル クエリを実行するプロジェクトのデフォルトの KMS 鍵を設定します。
  • グローバル クエリは Assured Workloads ではサポートされていません。
  • 1 つのグローバル クエリで、リージョンごとに最大 10 個のリモートテーブルにアクセスできます。