Spanner 連携クエリ

データ アナリストは、連携クエリを使用して、Spanner 内のデータを BigQuery からクエリできます。

BigQuery Spanner 連携機能を使用すると、データのコピーや移動を行わずに、BigQuery でクエリを実行して、Spanner に存在するデータをリアルタイムで取得できます。

Spanner データは次の 2 つの方法でクエリできます。

  • Spanner 外部データセットを作成する。
  • EXTERNAL_QUERY 関数を使用します。

外部データセットを使用する

Spanner テーブルをクエリする最も簡単な方法は、外部データセットを作成することです。外部データセットを作成すると、対応する Spanner データベースのテーブルが BigQuery に表示され、クエリ(結合、結合、サブクエリなど)で使用できるようになります。ただし、Spanner から BigQuery ストレージにデータは移動されません。

外部データセットを作成する場合は、Spanner データをクエリするための接続を作成する必要はありません。

EXTERNAL_QUERY 関数を使用する

他の連携データベースと同様に、EXTERNAL_QUERY 関数を使用して Spanner データをクエリすることもできます。これは、PostgreSQL 言語を使用する Spanner データベースをクエリする場合や、接続パラメータをより細かく制御する場合に役立ちます。

始める前に

  • BigQuery 管理者が Spanner 接続を作成し、それを共有していることを確認します。 適切な接続を選択するをご覧ください。
  • Spanner インスタンスに対するクエリに必要な権限を取得するには、BigQuery 接続ユーザー(roles/bigquery.connectionUser)の Identity and Access Management(IAM)ロールを付与するよう管理者に依頼してください。また、次のうちのいずれかについても、管理者に付与を依頼する必要があります。
    • きめ細かいアクセス制御ユーザーの場合、クエリ内のすべての Spanner スキーマ オブジェクトに対する SELECT 権限を持つデータベース ロールにアクセスする必要があります。
    • きめ細かなアクセス制御のユーザーでない場合は、Cloud Spanner データベース読み取り(roles/spanner.databaseReader)IAM ロールが必要です。

    IAM ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。きめ細かなアクセス制御については、きめ細かなアクセス制御についてをご覧ください。

正しい接続を選択する

Spanner のきめ細かなアクセス制御のユーザーは、EXTERNAL_QUERY 関数を使用して連携クエリを実行するときに、データベース ロールを指定する Spanner 接続を使用する必要があります。その後、この接続で実行されるすべてのクエリは、そのデータベース ロールを使用します。

データベース ロールを指定しない接続を使用する場合は、始める前にに示されている IAM ロールを持っている必要があります。

データのクエリ

GoogleSQL クエリから Spanner に連携クエリを送信するには、EXTERNAL_QUERY 関数を使用します。

データベースの指定した言語に応じて、GoogleSQL または PostgreSQL で Spanner クエリを作成します。

次の例では、orders という名前の Spanner データベースに連携クエリを実行し、mydataset.customers という名前の BigQuery テーブルに結果を結合します。

SELECT c.customer_id, c.name, rq.first_order_date
FROM mydataset.customers AS c
LEFT OUTER JOIN EXTERNAL_QUERY(
  'my-project.us.example-db',
  '''SELECT customer_id, MIN(order_date) AS first_order_date
  FROM orders
  GROUP BY customer_id''') AS rq
  ON rq.customer_id = c.customer_id
GROUP BY c.customer_id, c.name, rq.first_order_date;

Spanner Data Boost

Data Boost は、サポートされている Spanner ワークロード用の独立したコンピューティング リソースを提供する、フルマネージドのサーバーレス機能です。Data Boost を使用すると、プロビジョニングされた Spanner インスタンスの既存のワークロードへの影響がほぼゼロの、分析クエリとデータ エクスポートを実行できます。Data Boost では、プロビジョニングされたインスタンスとは別個の独立したコンピューティング容量で連携クエリを実行できるので、Spanner 上の既存のワークロードへの影響が回避されます。Data Boost は、複雑なアドホック クエリを実行する場合、または既存の Spanner ワークロードに影響を与えることなく大量のデータを処理する場合に最も効果的です。Data Boost を使用して連携クエリを実行すると、CPU 消費量が大幅に削減され、場合によってはクエリのレイテンシが低くなる可能性があります。

始める前に

Data Boost へのアクセスに必要な権限を取得するには、Spanner データベースに対する Cloud Spanner データベース管理者roles/spanner.databaseAdmin)IAM ロールを付与するよう管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。

この事前定義ロールには、Data Boost へのアクセスに必要となる spanner.databases.useDataBoost 権限が含まれています。

カスタムロールや他の事前定義ロールを使用して、この権限を取得することもできます。

Data Boost を有効にする

外部データセットを使用する場合、Data Boost は常に使用され、手動で有効にする必要はありません。

EXTERNAL_QUERY クエリに Data Boost を使用する場合は、クエリで使用される接続を作成するときに有効にする必要があります。

データを同時に読み込む

Spanner は、特定のクエリをより小さな部分またはパーティションに分割し、パーティションを同時にフェッチします。詳細については、Spanner ドキュメントのデータを同時に読み込むをご覧ください。

ただし、このオプションは次のいずれかの条件を満たすクエリに限定されます。

その他のクエリではエラーが返されます。Spanner クエリのクエリ実行プランを表示するには、Spanner がクエリを実行する方法を理解するをご覧ください。

外部データセットで連携クエリを実行する場合は、常に [データを並列で読み取る] オプションが使用されます。

EXTERNAL_QUERY の使用時に並列読み取りを有効にするには、接続を作成するときに有効にします。

クエリ実行優先度を管理する

EXTERNAL_QUERY 関数を使用して連携クエリを実行する場合は、query_execution_priority オプションを指定して個々のクエリに優先度(highmediumlow)を割り当てることができます。

SELECT *
FROM EXTERNAL_QUERY(
  'my-project.us.example-db',
  '''SELECT customer_id, MIN(order_date) AS first_order_date
  FROM orders
  GROUP BY customer_id''',
  '{"query_execution_priority":"high"}');

デフォルトの優先度は medium です。

優先度 high のクエリは、トランザクション トラフィックと競合します。優先度 low のクエリはベスト エフォート型であり、スケジュール バックアップなど、バックグラウンドの負荷によってプリエンプトされる可能性があります。

外部データセットで連携クエリを実行する場合、すべてのクエリの優先度は常に medium です。

Spanner テーブル スキーマを表示する

外部データセットを使用する場合、Spanner テーブルは BigQuery Studio に直接表示され、スキーマを確認できます。

ただし、外部データセットを定義しなくてもスキーマを表示できます。EXTERNAL_QUERY 関数を使用して information_schema ビューにクエリを実行し、データベース メタデータにアクセスすることもできます。次の例では、テーブル MyTable 内の列に関する情報が返されます。

Google SQL データベース

SELECT *
FROM EXTERNAL_QUERY(
  'my-project.us.example-db',
  '''SELECT t.column_name, t.spanner_type, t.is_nullable
    FROM information_schema.columns AS t
    WHERE
      t.table_catalog = ''
      AND t.table_schema = ''
     AND t.table_name = 'MyTable'
    ORDER BY t.ordinal_position
  ''');

PostgreSQL データベース

SELECT * from EXTERNAL_QUERY(
 'my-project.us.postgresql.example-db',
  '''SELECT t.column_name, t.data_type, t.is_nullable
    FROM information_schema.columns AS t
    WHERE
      t.table_schema = 'public' and t.table_name='MyTable'
    ORDER BY t.ordinal_position
  ''');

詳細については、Spanner ドキュメントにある次の情報スキーマ リファレンスをご覧ください。

料金

  • BigQuery 側では、標準の連携クエリの料金が適用されます。
  • Spanner 側では、クエリは Spanner の料金の対象となります。
  • プレビュー ステージから一般提供ステージに移行する際に料金が変更される場合があります

トラブルシューティング

このセクションは、連携クエリを Spanner に送信するときに発生する問題のトラブルシューティングに役立ちます。

問題: クエリがルート パーティション化できない。
解決策: データを並列で読み取るように接続を構成する場合は、クエリ実行プランの最初の演算子を分散ユニオンにするか、実行プランが分散ユニオンを持たないようにする必要があります。このエラーを解決するには、クエリ実行プランを確認して、クエリを書き換えます。詳細については、Spanner がクエリを実行する仕組みをご覧ください。
問題: 期限を超過している。
解決策: データを並列に読み取り、クエリをルート パーティション可能に書き換えるオプションを選択します。詳細については、Spanner がクエリを実行する仕組みをご覧ください。

次のステップ