非同期セカンダリ インデックス クエリ

このドキュメントでは、Bigtable で非同期セカンダリ インデックスを構築するための一般的なクエリ パターンの例を示します。この例では、サンプル用のデータと同様の ID と値を使用します。クエリをテストするには、テストテーブルを作成します。

このページを読む前に、非同期セカンダリ インデックスの作成Bigtable 用の GoogleSQL について理解しておいてください。

クエリの例

次の例は、さまざまな GoogleSQL クエリを使用して非同期セカンダリ インデックスを作成する方法を示しています。

列修飾子と値に基づいて転置インデックスを作成する

次のクエリは、柔軟なスキーマを持つ列ファミリーからすべての Key-Value ペアを抽出して、転置インデックスを作成します。MAP_ENTRIES を使用して stats_summary 列ファミリーに保存されているすべてのデータの配列を取得し、UNNEST を使用して各キーと値のペアを個別の行に変換します。結果として得られるインデックスにより、stat_descriptionstat_value に基づく高速ルックアップが可能になります。ソーステーブルに新しいタイプの統計情報を追加すると、Bigtable はそれらを非同期インデックスに自動的に含めます。

SELECT
 stats.key as stat_description,
 stats.value as stat_value,
 _key as original_key,
 cell_plan as cell_plan
FROM test_table
CROSS JOIN UNNEST(MAP_ENTRIES(stats_summary)) stats
ORDER BY stat_description, stat_value, original_key

既存のデータに基づいて新しい行キーを作成する

次の例では、cell_plan 列ファミリーに保存されているデータプランを分類して、新しいインデックス キー total_plan_capacity を作成します。このクエリでは、MAP_KEYS を使用して cell_plan 内のすべてのキーを取得し、ARRAY_INCLUDES_ANY を使用して特定のデータプランキーをフィルタします。次に、CASE ステートメントは、これらのデータプランの有無と値に基づいて total_plan_capacity カテゴリを割り当てるロジックを定義します。これにより、データプランの容量を組み合わせて効率的にルックアップできます。

SELECT
 CASE
    WHEN
     cell_plan['data_plan_01gb'] = "true"
     AND (cell_plan['data_plan_05gb'] = "false" OR cell_plan['data_plan_05gb'] IS NULL)
     AND (cell_plan['data_plan_10gb'] = "false" OR cell_plan['data_plan_10gb'] IS NULL)
   THEN 'x-small'

   WHEN
     cell_plan['data_plan_01gb'] = "true"
     AND (cell_plan['data_plan_05gb'] = "true")
     AND (cell_plan['data_plan_10gb'] = "false" OR cell_plan['data_plan_10gb'] IS NULL)
   THEN 'small'

   WHEN
     cell_plan['data_plan_01gb'] = "true"
     AND (cell_plan['data_plan_05gb'] = "false" OR cell_plan['data_plan_05gb'] IS NULL)
     AND (cell_plan['data_plan_10gb'] = "true")
   THEN 'medium'

   WHEN
     (cell_plan['data_plan_01gb'] = "false" OR cell_plan['data_plan_01gb'] IS NULL)
     AND (cell_plan['data_plan_05gb'] = "true")
     AND (cell_plan['data_plan_10gb'] = "true")
   THEN 'large'

   WHEN
     cell_plan['data_plan_01gb'] = "true"
     AND (cell_plan['data_plan_05gb'] = "true")
     AND (cell_plan['data_plan_10gb'] = "true")
   THEN 'x-large'
 END as total_plan_capacity,
 _key as original_key,
 stats_summary
FROM test_table
WHERE ARRAY_INCLUDES_ANY(MAP_KEYS(cell_plan), ["data_plan_01gb", "data_plan_05gb","data_plan_10gb"])
ORDER BY total_plan_capacity, original_key

時系列ベースのインデックスを作成する

Bigtable は、各セル値と関連するタイムスタンプを保存します。FROM 句で WITH_HISTORY=>TRUE フラグを使用すると、データのすべてのバージョンとそのタイムスタンプを取得できます。UNPACK テーブル関数は、クエリ結果を拡張して、タイムスタンプ付きの値が個別の _timestamp 列を含む独自の行に表示されるようにします。これにより、新しい行キーがこれらのタイムスタンプ値に基づく非同期セカンダリ インデックスを作成し、時間範囲に基づく高速ルックアップが可能になります。

SELECT
 _timestamp as stats_timestamp,
 _key as original_key,
 stats_summary
FROM UNPACK((
 select
   _key,
   stats_summary
  FROM
 test_table (WITH_HISTORY=>TRUE)
))
ORDER BY stats_timestamp, original_key

JSON セルの項目と値のインデックス エントリを作成する

Bigtable は、JSON などの形式のデータを含む大規模なワークロードの Key-Value ストアとしてよく使用されます。次の例は、JSON が保存するデータの高速ルックアップ用に非同期セカンダリ インデックスを作成する方法を示しています。このクエリでは、JSON_EXTRACT を使用して、sales という名前のテーブルの transaction_information 列ファミリー内の JSON 文字列から store_id を抽出します。このインデックスを使用すると、特定の店舗 ID で販売トランザクションをすばやく取得できます。

SELECT
JSON_EXTRACT(transaction_information["json"], "$.store_id") as store_id,
_key as original_key,
transaction_information
from sales
ORDER BY store_id, original_key;

次のステップ