連携クエリの概要

このページでは、連携クエリの使用方法と、BigQuery から Spanner、AlloyDB、Cloud SQL のデータをクエリする方法について説明します。

連携クエリを使用すると、クエリ ステートメントを AlloyDB、Spanner、または Cloud SQL データベースに送信し、結果を一時テーブルとして取得できます。連携クエリは、BigQuery Connection API を使用して AlloyDB、Spanner、または Cloud SQL との接続を確立します。クエリで EXTERNAL_QUERY 関数を使用して、外部データベースの SQL 言語を使用してクエリ ステートメントを外部データベースに送信します。結果は GoogleSQL データ型に変換されます。

サポートされているデータストア

連携クエリは、次のデータストアで使用できます。

ワークフロー

  • クエリを実行するデータソースを含む Google Cloud プロジェクトを特定します。
  • bigquery.admin ユーザーが BigQuery で接続リソースを作成します。
  • 管理ユーザーが、ユーザー B に接続リソースの使用権限を付与します。
    • 管理者とユーザー B が同一人物の場合は、権限を付与する必要はありません。
  • ユーザー B が BigQuery で新しい EXTERNAL_QUERY SQL 関数を使用してクエリを作成します。

連携クエリの代替手段: 外部テーブルとデータセット

Bigtable、Spanner、Cloud Storage、Google ドライブ、Salesforce Data Cloud などの運用データベースに対してクエリを実行する別の方法として、外部テーブルとデータセットを使用する方法もあります。外部データセットとテーブルを使用すると、EXTERNAL_QUERY SQL 関数を使用せずに、テーブルとそのスキーマを表示してクエリを実行できます。データを BigQuery に戻す必要はなく、SQL の特定の SQL データベース ダイアレクトで記述する代わりに、BigQuery 構文を使用できます。

サポートされているリージョン

連携クエリは、外部データソースと BigQuery の両方をサポートするリージョンでのみサポートされます。 サポートされているロケーションの一覧については、次のセクションをご覧ください。

次のルールに従って接続を作成し、リージョン間で連携クエリを実行できます。

単一リージョン

BigQuery の単一リージョンは、同じリージョン内のリソースにのみクエリを実行できます。

たとえば、データセットが us-east4 にある場合、us-east4 内に配置されている Cloud SQL インスタンス、AlloyDB インスタンス、または Spanner データベースに対してクエリを実行できます。クエリ処理ロケーションは BigQuery の単一リージョンです。

マルチリージョン

BigQuery マルチリージョンは、同じ大規模な地理的領域(米国、EU)内の任意のデータソース リージョンにクエリを実行できます。マルチリージョンのロケーションは Cloud SQL インスタンスでは使用できません。これらはバックアップにのみ使用されるためです。BigQuery マルチリージョンは、同じマルチリージョン内の Spanner インスタンスに対してクエリを実行することもできます。

  • BigQuery US マルチリージョンで実行されるクエリは、us-central1us-east4us-west2 など、米国内の任意のシングル リージョンに対してクエリを実行できます。

  • BigQuery EU マルチリージョンで実行されるクエリは、europe-north1europe-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 接続は米国のマルチリージョンを基点にしています。BigQuery のクエリ処理ロケーションは US です。
  • 割り当て。ユーザーは、Cloud SQL や AlloyDB などの外部データソースでクエリ割り当てを制御する必要があります。連携クエリに追加の割り当て設定はありません。ワークロードの分離を実現するには、データベースのリードレプリカに対してのみクエリを実行することをおすすめします。
  • 課金される最大バイト数。このフィールドは、連携クエリではサポートされていません。実際に連携クエリを実行する前に課金対象のバイト数を計算することはできません。
  • 接続数。連携クエリで使用できる一意の接続は最大 10 個です。
  • Cloud SQL の MySQLPostgreSQL。割り当てと上限が適用されます。

制限事項

連携クエリには、次の制限があります。

  • パフォーマンス。連携クエリは、BigQuery ストレージのみをクエリするほど高速ではない可能性があります。BigQuery の場合、外部クエリを実行し、外部データソースから BigQuery にデータを一時的に移動するまで、ソース データベースが待機状態になります。また、ソース データベースが複雑な分析クエリ用に最適化されていない可能性があります。

    また、クエリのパフォーマンスは、データセットと外部データソースの近接度に応じて異なります。詳細については、サポートされているリージョンをご覧ください。

  • 連携クエリは読み取り専用です。ソース データベースで実行される外部クエリは読み取り専用である必要があります。したがって、DML ステートメントと DDL ステートメントはサポートされていません。

  • サポートされていないデータ型。BigQuery でサポートされていないデータ型が外部クエリに含まれている場合、クエリはすぐに失敗します。サポートされていないデータ型は、サポートされている別のデータ型にキャストできます。

  • Project タイプの権限です。接続リソースは、Cloud SQL インスタンスまたは AlloyDB インスタンスと同じプロジェクトに作成する必要があります。

料金

  • オンデマンド料金モデルを使用している場合は、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 プッシュダウンは、Spanner 外部データセットを使用して連携クエリを実行する場合にも適用されます。

適用されたプッシュダウン(存在する場合)は、クエリプランで確認できます。

制限事項

SQL プッシュダウンには、外部データソースとデータのクエリ方法に応じて異なるさまざまな制限があります。

EXTERNAL_QUERY を使用するクエリ フェデレーションの制限

  • SQL プッシュダウンは、SELECT * FROM T 形式の連携クエリにのみ適用されます。
  • 列のプルーニングとフィルタ プッシュダウンのみがサポートされています。具体的には、コンピューティング、結合、上限、順序付け、集計のプッシュダウンはサポートされていません。
  • フィルタ プッシュダウンの場合、リテラルの型は BOOLINT64FLOAT64STRINGDATEDATETIMETIMESTAMP のいずれかにする必要があります。構造体であるリテラルはサポートされていません。
  • SQL 関数のプッシュダウンは、BigQuery と宛先データベースの両方でサポートされている関数にのみ適用されます。
  • SQL プッシュダウンは、AlloyDB、Cloud SQL、Spanner でのみサポートされています。
  • SAP Datasphere では SQL プッシュダウンはサポートされていません。

Spanner 外部データセットを使用する場合のクエリ連携の制限事項

  • 列のプルーニング、フィルタ、コンピューティング、部分集計のプッシュダウンがサポートされています。特に、結合、上限、集計による並べ替えはサポートされていません。
  • フィルタ プッシュダウンの場合、リテラルの型は BOOLINT64FLOAT64STRINGDATEDATETIMETIMESTAMPBYTE、または配列のいずれかにする必要があります。構造体であるリテラルはサポートされていません。
  • SQL 関数のプッシュダウンは、BigQuery と Spanner の両方でサポートされている関数にのみ適用されます。

データソース別のサポートされている関数

データソース別のサポートされている SQL 関数は次のとおりです。SAP Datasphere では関数はサポートされていません。

Cloud SQL MySQL

  • 論理演算子: ANDORNOT
  • 比較演算子: =>>=<<=<>INBETWEENIS NULL
  • 算術演算子: +-*INT64FLOAT64 のみ)。

Cloud SQL PostgreSQL、AlloyDB

  • 論理演算子: ANDORNOT
  • 比較演算子: =>>=<<=<>INBETWEENIS NULL
  • 算術演算子: +-*/INT64FLOAT64DATE のみ、DATE 減算を除く)。

Spanner - PostgreSQL 言語

  • 論理演算子: ANDORNOT
  • 比較演算子: =>>=<<=<>INBETWEENIS NULL
  • 算術演算子: +-*/INT64FLOAT64NUMERIC のみ)。

Spanner - GoogleSQL 言語

  • 論理演算子: ANDORNOT
  • 比較演算子: =>>=<<=<>INBETWEENIS NULL
  • 算術演算子: +-*/INT64FLOAT64NUMERIC のみ)。
  • 安全な算術演算子: SAFE_ADDSAFE_SUBTRACTSAFE_MULTIPLYSAFE_DIVIDEINT64FLOAT64NUMERIC のみ)。
  • 外部データセットを使用する場合は、さらに次のことを行います。
    • コンピューティング プッシュダウン、
    • 部分集計プッシュダウン、
    • 文字列関数、
    • 数学関数、
    • キャスト関数、
    • 配列関数。

次のステップ