非同步次要索引查詢

本文提供常見查詢模式的範例,說明如何在 Bigtable 中建構非同步次要索引。範例使用的 ID 和值與範例資料中的類似,您可以建立測試資料表來測試查詢。

閱讀本頁面之前,請先熟悉「建立非同步次要索引」和「Bigtable 適用的 GoogleSQL」。

查詢範例

下列範例說明如何使用不同的 GoogleSQL 查詢,建立非同步次要索引。

根據資料欄限定符和值建立反向索引

下列查詢會從具有彈性結構定義的資料欄系列中,擷取所有鍵/值組合,藉此建立反向索引。這項轉換會使用 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

根據現有資料建立新的資料列鍵

下列範例會建立新的索引鍵 total_plan_capacity,方法是將 cell_plan 欄系列儲存的資料方案分類。查詢會使用 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 等格式的資料。以下範例說明如何建立非同步次要索引,以便快速查詢 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;

後續步驟