連携クエリの概要
このページでは、連携クエリの使用方法と、BigQuery から Spanner と Cloud SQL のデータをクエリする方法について説明します。
連携クエリによって、クエリ ステートメントを Spanner または Cloud SQL データベースに送信し、結果を一時テーブルとして取得できます。連携クエリは、BigQuery Connection API を使用して Spanner または Cloud SQL との接続を確立します。クエリで EXTERNAL_QUERY
関数を使用して、外部データベースの SQL 言語を使用してクエリ ステートメントを外部データベースに送信します。結果は GoogleSQL データ型に変換されます。
サポートされているデータストア
連携クエリは、次のデータストアで使用できます。
ワークフロー
- クエリを実行するデータソースを含む Google Cloud プロジェクトを特定します。
bigquery.admin
ユーザーが BigQuery で接続リソースを作成します。- 管理ユーザーが、ユーザー B に接続リソースの使用権限を付与します。
- 管理者とユーザー B が同一人物の場合は、権限を付与する必要はありません。
- ユーザー B が BigQuery で新しい
EXTERNAL_QUERY
関数を使用してクエリを作成します。
サポートされるリージョン
連携クエリは、外部データソースと BigQuery の両方をサポートするリージョンでのみサポートされます。サポートされているロケーションの一覧については、次のセクションをご覧ください。
次のルールに従って接続を作成し、リージョン間で連携クエリを実行できます。
単一リージョン
BigQuery の単一リージョンは、同じリージョン内のリソースにのみクエリを実行できます。
たとえば、データセットが us-east4
にある場合、us-east4
内に配置されている Cloud SQL インスタンスのみまたは Spanner データベースのみに対してクエリを実行できます。クエリ処理ロケーションは BigQuery の単一リージョンです。
マルチリージョン
BigQuery マルチリージョンは、同じ大規模な地域(米国、EU)内の任意のデータソース リージョンにクエリを実行できます。次に例を示します。マルチリージョンのロケーションは Cloud SQL インスタンスでは使用できません。これらはバックアップにのみ使用されるためです。BigQuery マルチリージョンは、同じマルチリージョン内の Spanner インスタンスに対してクエリを実行することもできます。
BigQuery US マルチリージョンで実行されるクエリは、
us-central1
、us-east4
、us-west2
など、米国内の任意のシングル リージョンに対してクエリを実行できます。BigQuery EU マルチリージョンで実行されるクエリは、
europe-north1
、europe-west3
など、EU の加盟国にある任意のシングル リージョンに対してクエリを実行できます。クエリを実行するロケーションは、接続リソースのロケーションと同じにする必要があります。たとえば、US マルチリージョンから実行されるクエリは、US マルチリージョンにある接続を使用する必要があります。
クエリのパフォーマンスは、データセットと外部データソースの近接度に応じて異なります。たとえば US マルチリージョンのデータセットと us-central1
の Cloud SQL インスタンス間の連携クエリは高速です。ただし、US マルチリージョンと us-east4
の Cloud SQL インスタンスの間で同じクエリを実行すると、パフォーマンスが低下する可能性があります。
クエリ処理ロケーションはマルチリージョン ロケーション(US
または EU
)です。
データ型マッピング
連携クエリを実行すると、外部データソースのデータは GoogleSQL のデータ型に変換されます。詳細については、Cloud SQL 連携クエリをご覧ください。
割り当てと上限
- クロスリージョンの連携クエリ: BigQuery のクエリ処理ロケーションと外部データソースのロケーションが異なる場合、クロスリージョンのクエリになります。プロジェクトごとに 1 日あたり 1 TB までクロス リージョンのクエリを実行できます。クロスリージョンのクエリの例を次に示します。
- Cloud SQL インスタンスは
us-west1
にありますが、BigQuery 接続は US マルチリージョンを基点にしています。BigQuery のクエリ処理ロケーションはUS
です。
- Cloud SQL インスタンスは
- 割り当て: ユーザーは、Cloud SQL などの外部データソースのクエリ割り当てを制御する必要があります。連携クエリに追加の割り当て設定はありません。ワークロードの分離を実現するには、データベースのリードレプリカに対してのみクエリを実行することをおすすめします。
- 課金対象の最大バイト数: 現時点で、このフィールドは連携クエリで使用できません。実際に連携クエリを実行する前に課金対象のバイト数を計算することはできません。
- 接続数: 連携クエリは、最大 10 の一意の接続を使用できます。
- Cloud SQL の MySQL と PostgreSQL の割り当てと上限が適用されます。
制限事項
Spanner 連携クエリには、次の制限があります。
パフォーマンス。連携クエリは、BigQuery ストレージのみをクエリするほど高速ではない可能性があります。BigQuery の場合、外部クエリを実行し、外部データソースから BigQuery にデータを一時的に移動するまで、ソース データベースが待機状態になります。また、ソース データベースが複雑な分析クエリ用に最適化されていない可能性があります。
また、クエリのパフォーマンスは、データセットと外部データソースの近接度に応じて異なります。詳細については、サポートされているリージョンをご覧ください。
連携クエリは読み取り専用です。ソース データベースで実行される外部クエリは読み取り専用である必要があります。したがって、DML ステートメントと DDL ステートメントはサポートされていません。
サポートされていないデータ型。BigQuery でサポートされていないデータ型が外部クエリに含まれている場合、クエリはすぐに失敗します。サポートされていないデータ型は、サポートされている別のデータ型にキャストできます。
プロジェクト。接続リソースは Cloud SQL インスタンスと同じプロジェクトに作成する必要があります。
料金
オンデマンド料金モデルを使用している場合は、BigQuery から連携クエリを実行すると、外部クエリから返されたバイト数に基づいて課金されます。詳しくは、オンデマンド分析の料金をご覧ください。
BigQuery エディションを使用している場合は、使用するスロット数に基づいて課金されます。詳細については、容量コンピューティングの料金をご覧ください。
SQL プッシュダウン
連携クエリには、SQL プッシュダウンと呼ばれる最適化手法が適用されます。フィルタリングなどのオペレーションを BigQuery で実行する代わりに、外部データソースに委任することで、クエリのパフォーマンスが向上します。外部データソースから転送されるデータの量を減らすと、クエリの実行時間を短縮し、費用を削減できます。SQL プッシュダウンには、列のプルーニング(SELECT
句)とフィルタ プッシュダウン(WHERE
句)の両方が含まれます。
EXTERNAL_QUERY
関数を使用した場合、元のクエリを書き換えることで SQL プッシュダウンが機能します。次の例では、EXTERNAL_QUERY
関数を使用して Cloud SQL データベースと通信します。
SELECT COUNT(*)
FROM (
SELECT * FROM EXTERNAL_QUERY("<connection>", "select * from operations_table")
)
WHERE a = 'Y' AND b NOT IN ('COMPLETE','CANCELLED');
SQL プッシュダウンを使用しない場合は、次のクエリが Cloud SQL に送信されます。
SELECT *
FROM operations_table
このクエリを実行すると、一部の行と列だけが必要な場合でもテーブル全体が BigQuery に返されます。
SQL プッシュダウンを使用すると、次のクエリが Cloud SQL に送信されます。
SELECT `a`, `b`
FROM (
SELECT * FROM operations_table) t
WHERE ((`a` = 'Y') AND (NOT `b` IN ('COMPLETE', 'CANCELLED'))
このクエリを実行すると、2 つの列のみと、フィルタリングの述語に一致する行が BigQuery に返されます。
制限事項
- SQL プッシュダウンは、
SELECT * FROM T
形式の連携クエリにのみ適用されます。 - 列のプルーニングとフィルタ プッシュダウンのみがサポートされています。コンピューティング、結合、集計のプッシュダウンはサポートされていません。
- フィルタ プッシュダウンの場合、リテラルの型は
BOOL
、INT64
、FLOAT64
、STRING
、DATE
、DATETIME
、TIMESTAMP
のいずれかにする必要があります。構造体または配列であるリテラルはサポートされていません。
データソース別のサポートされている関数
Cloud SQL MySQL
- 論理演算子:
AND
、OR
、NOT
。 - 比較演算子:
=
、>
、>=
、<
、<=
、<>
、IN
、BETWEEN
、IS NULL
。 - 算術演算子:
+
、-
、*
(INT64
とFLOAT64
のみ)。
Cloud SQL PostgreSQL でサポートされている関数
- 論理演算子:
AND
、OR
、NOT
。 - 比較演算子:
=
、>
、>=
、<
、<=
、<>
、IN
、BETWEEN
、IS NULL
。 - 算術演算子:
+
、-
、*
、/
(INT64
、FLOAT64
、DATE
のみ、DATE
減算を除く)。
Spanner - PostgreSQL 言語
- 論理演算子:
AND
、OR
、NOT
。 - 比較演算子:
=
、>
、>=
、<
、<=
、<>
、IN
、BETWEEN
、IS NULL
。 - 算術演算子:
+
、-
、*
、/
(INT64
、FLOAT64
、NUMERIC
のみ)。
Spanner - GoogleSQL 言語
GoogleSQL 言語では PostgreSQL 言語と同じ関数のほかに、次の関数もサポートしています。
- 安全な算術演算子:
SAFE_ADD
、SAFE_SUBTRACT
、SAFE_MULTIPLY
、SAFE_DIVIDE
(INT64
、FLOAT64
、NUMERIC
のみ)。
次のステップ
- Spanner データのクエリを実行する方法を確認する。
- Cloud SQL データのクエリを実行する方法を確認する。