非同步次要索引查詢
本文提供常見查詢模式的範例,說明如何在 Bigtable 中建構非同步次要索引。範例使用的 ID 和值與範例資料中的類似,您可以建立測試資料表來測試查詢。
閱讀本頁面之前,請先熟悉「建立非同步次要索引」和「Bigtable 適用的 GoogleSQL」。
查詢範例
下列範例說明如何使用不同的 GoogleSQL 查詢,建立非同步次要索引。
根據資料欄限定符和值建立反向索引
下列查詢會從具有彈性結構定義的資料欄系列中,擷取所有鍵/值組合,藉此建立反向索引。這項轉換會使用 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
因此,原始 stats_summary
資料欄系列中的每個鍵/值組,在連續具體化檢視中都有自己的資料列:
stat_description (key) | stat_value (key) | original_key (key) | cell_plan |
---|---|---|---|
connected_cell | 「2」 | phone#4c410523#20190501 | { "data_plan_01gb": "true", "data_plan_05gb": "false" } |
os_build | PQ2A.190401.002 | phone#5c10102#20190501 | { "data_plan_10gb": "false" } |
如要快速查詢 Bigtable 擷取的資料值,請使用新的資料列鍵查詢資料,如下列範例所示:
SELECT cell_plan, original_key
FROM `mv_inverted_index`
WHERE stat_description = "connected_cell"
AND stat_value = "2"
根據現有資料建立新的資料列鍵
下列範例會建立新的索引鍵 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;