グローバル クエリ

グローバル クエリを使用すると、複数のリージョンに保存されているデータを参照する 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. このロールを選択したユーザーまたはサービス アカウントに割り当てます。

データのクエリ

グローバル クエリを実行するには、データが単一のロケーションにある場合と同じように 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. データをプライマリ ロケーションの一時テーブルに 24 時間保存します。
  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 に複製する必要はありません。リクエストされた列(col2col3)と 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: グローバル クエリを無効にするリージョンの名前

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

料金

グローバル クエリの費用は、次のコンポーネントで構成されます。

  • リモート ロケーションのすべてのサブクエリのコンピューティング費用(これらのロケーションの料金モデルに基づく)
  • 実行されるリージョンの最終クエリのコンピューティング費用(そのリージョンの料金モデルに基づく)
  • データ レプリケーションの料金に基づく、異なるロケーション間のデータコピーの費用
  • ストレージ料金に基づく、リモート リージョンからプライマリ リージョンにコピーされたデータ(24 時間)の保存費用

割り当て

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

制限事項

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