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)ロールを付与するよう管理者に依頼してください。また、次のうちいずれか 1 つを付与するよう管理者に依頼する必要もあります。
    • きめ細かなアクセス制御のユーザーの場合、クエリ内のすべての 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 に送信するときに発生する問題のトラブルシューティングに役立ちます。

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

次のステップ