Spanner 連携クエリ

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

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

始める前に

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

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

正しい接続を選択する

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

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

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 を有効にする

Spanner への連携クエリで Data Boost を有効にするには、まず Spanner との接続を確立する必要があります。接続内で Data Boost を有効にした後、データをクエリして、連携クエリを Spanner に送信します。

データのクエリ

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 は、特定のクエリをより小さな部分またはパーティションに分割し、パーティションを同時に取得します。詳細については、Spanner ドキュメントのデータを同時に読み込むをご覧ください。

連携クエリで同時読み取りを有効にするには、接続リソースを作成するときにこの設定を構成します。このオプションは、SQL クエリを小さなパーティションに分割し、各パーティションを並列に取得します。ただし、このオプションは次のいずれかの条件を満たすクエリに限定されます。

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

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

次のように 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 のクエリはベスト エフォート型であり、スケジュールされたバックアップなどのバックグラウンド負荷によってプリエンプトされる可能性があります。

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

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 ドキュメントにある次の情報スキーマ リファレンスをご覧ください。

トラブルシューティング

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

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

次のステップ