グローバル クエリ
グローバル クエリを使用すると、複数のリージョンに保存されているデータを参照する 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 つのプロジェクトで実行し、別のプロジェクトの他のリージョンからデータを取得できます。
次の例は、プロジェクト レベルでこれらの設定を変更する方法を示しています。プロジェクト PROJECT_1_ID のリージョン REGION_1 でグローバル クエリを実行し、プロジェクト PROJECT_2_ID の REGION_2 からデータを取得するとします。
ALTER PROJECT `PROJECT_1_ID` SET OPTIONS ( `region-REGION_1.enable_global_queries_execution` = true ); ALTER PROJECT `PROJECT_2_ID` SET OPTIONS ( `region-REGION_2.enable_global_queries_data_access` = true );
次のように置き換えます。
PROJECT_1_ID: グローバル クエリが実行されるプロジェクトの名前REGION_1: グローバル クエリが実行されるリージョンPROJECT_2_ID: グローバル クエリがデータを取得するプロジェクトの名前REGION_2: グローバル クエリがデータを取得するリージョン
変更が有効になるまで数分かかることがあります。
必要な権限
グローバル クエリを実行するには、bigquery.jobs.createGlobalQuery 権限が必要です。この権限を含む事前定義ロールは、BigQuery 管理者ロールのみです。BigQuery 管理者ロールを付与せずにグローバル クエリを実行する権限を付与するには、次の操作を行います。
- 「BigQuery グローバル クエリ実行者」などのカスタムロールを作成します。
- このロールに
bigquery.jobs.createGlobalQueryを追加します。 - このロールを選択したユーザーまたはサービス アカウントに割り当てます。
データのクエリ
グローバル クエリを実行するには、データが単一のロケーションにある場合と同じように 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
自動ロケーション選択
次の場合は、クエリを実行するロケーションが自動的に決定され、変更できません。
- データ変更言語クエリ(
INSERT、UPDATE、DELETEステートメント)は、常にターゲット テーブルのロケーションで実行されます。 CREATE TABLE AS SELECTステートメントなどのデータ定義言語クエリは、リソースが作成または変更されたロケーションで常に実行されます。- 宛先テーブルが指定されたクエリは、常に宛先テーブルがあるロケーションで実行されます。
場所を選択
通常、グローバル クエリの実行場所はユーザーが決定します。この判断を行うには、次の点を考慮してください。
グローバル クエリは、データをあるロケーションから別のロケーションに一時的にコピーします。組織にデータ所在地の要件があり、ロケーション A のデータをロケーション A から移動させたくない場合は、クエリのロケーションを A に設定します。
ロケーション間で転送されるデータ量を最小限に抑え、クエリの費用を削減するには、クエリ対象データの大部分が保存されているリージョンでクエリを実行します。
オンライン ショップを運営しており、商品のリストは us-central1 に、取引は us-south1 リージョンに保存しているとします。カタログ内の商品よりもトランザクションが多い場合は、us-south1 リージョンでクエリを実行する必要があります。
グローバル クエリについて
グローバル クエリを効率的かつ費用対効果の高い方法で実行するには、その実行の背後にあるメカニズムを理解することが重要です。
異なるロケーションにあるデータを使用するには、1 つのロケーションに複製する必要があります。以下は、BigQuery によって実行されるグローバル クエリ ワークフローの抽象化です。
- クエリを実行する場所を、ユーザーの宣言または自動のいずれかから決定します。このロケーションはプライマリ ロケーションと呼ばれ、クエリで参照される他のすべてのロケーションはリモート ロケーションと呼ばれます。
- 各リモート リージョンでサブクエリを実行して、プライマリ リージョンでクエリを完了するために必要なデータを収集します。
- このデータをリモート ロケーションからプライマリ ロケーションにコピーします。
- データをプライマリ ロケーションの一時テーブルに 8 時間保存します。
- プライマリ ロケーションで収集されたすべてのデータを使用して最終クエリを実行します。
- クエリ結果を返します。
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 PROJECTPROJECT_IDSET OPTIONS ( `region-REGION.enable_global_queries_execution` = false, `region-REGION.enable_global_queries_data_access` = false );
次のように置き換えます。
PROJECT_ID: 変更するプロジェクトの名前REGION: グローバル クエリを無効にするリージョンの名前
変更が有効になるまで数分かかることがあります。
料金
グローバル クエリの費用は、次のコンポーネントで構成されます。
- リモート ロケーションのすべてのサブクエリのコンピューティング費用(これらのロケーションの料金モデルに基づく)
- 実行されるリージョンの最終クエリのコンピューティング費用(そのリージョンの料金モデルに基づく)
- データ レプリケーションの料金に基づく、異なるロケーション間のデータコピーの費用
- ストレージの料金に基づく、リモート リージョンからプライマリ リージョンにコピーされたデータの保存費用(8 時間)
割り当て
グローバル クエリの割り当てについては、クエリジョブをご覧ください。
制限事項
- クエリの実行の詳細と実行グラフに、リモート ロケーションから処理および転送されたバイト数が表示されません。この情報は、ジョブ履歴で確認できるコピー ジョブに表示されます。グローバル クエリによって作成されたコピー ジョブのジョブ ID には、クエリジョブのジョブ ID が接頭辞として付加されます。
- サンドボックス モードではグローバル クエリはサポートされていません
- グローバル クエリでは、リージョン間のデータ転送に必要な時間のため、単一リージョン クエリよりもレイテンシが大きくなります。
- グローバル クエリは、リージョン間のデータ転送を回避するためにキャッシュを使用しません。
- グローバル クエリで
_PARTITIONTIMEなどの疑似列をクエリすることはできません。 - グローバル クエリで柔軟な列名を使用して列をクエリすることはできません。
WHERE句で BigLake テーブルの列を参照する場合、RANGEまたはINTERVALリテラルは使用できません。- グローバルな承認済みビューと承認済みルーティンはサポートされていません(あるロケーションのビューまたはルーティンが別のロケーションのデータセットにアクセスすることを承認されている場合)。
- グローバル クエリに対するマテリアライズド ビューはサポートされていません。
- グローバル クエリが
STRUCT列を参照している場合、リモート サブクエリにプッシュダウンは適用されません。パフォーマンスを最適化するには、リモート リージョンでビューを作成し、STRUCT列をフィルタして、必要なフィールドのみを個々の列として返すようにすることをご検討ください。 - グローバル クエリはアトミックに実行されません。データ レプリケーションは成功したが、クエリ全体が失敗した場合でも、データ レプリケーションの料金は請求されます。
- グローバル クエリの実行の一部としてリモート リージョンに作成された一時テーブルは、グローバル クエリの結果を暗号化するように構成された CMEK 鍵(テーブル、データセット、プロジェクトのいずれかのレベル)がグローバルである場合にのみ、顧客管理の暗号鍵(CMEK)を使用して暗号化されます。リモート一時テーブルが常に CMEK を使用して保護されるようにするには、リモート リージョンでグローバル クエリを実行するプロジェクトのデフォルトの KMS 鍵を設定します。
- グローバル クエリは Assured Workloads ではサポートされていません。
- グローバル クエリでは、リージョンごとに最大 10 個のテーブルにクエリを実行できます。