非同期セカンダリ インデックス クエリ
このドキュメントでは、Bigtable で非同期セカンダリ インデックスを構築するための一般的なクエリ パターンの例を示します。この例では、サンプル用のデータと同様の ID と値を使用します。クエリをテストするには、テストテーブルを作成します。
このページを読む前に、非同期セカンダリ インデックスの作成と Bigtable 用の GoogleSQL について理解しておいてください。
クエリの例
次の例は、さまざまな GoogleSQL クエリを使用して非同期セカンダリ インデックスを作成する方法を示しています。
列修飾子と値に基づいて転置インデックスを作成する
次のクエリは、柔軟なスキーマを持つ列ファミリーからすべての Key-Value ペアを抽出して、転置インデックスを作成します。MAP_ENTRIES
を使用して stats_summary
列ファミリーに保存されているすべてのデータの配列を取得し、UNNEST
を使用して各キーと値のペアを個別の行に変換します。結果として得られるインデックスにより、stat_description
と stat_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;