Query di indice secondario asincrono
Questo documento fornisce esempi di pattern di query comuni per la creazione di indici secondari asincroni in Bigtable. Gli esempi utilizzano ID e valori simili a quelli in Dati per gli esempi e puoi creare una tabella di test per testare le query.
Prima di leggere questa pagina, acquisisci familiarità con Creare un indice secondario asincrono e GoogleSQL per Bigtable.
Esempi di query
Gli esempi seguenti mostrano come creare indici secondari asincroni utilizzando diverse query GoogleSQL.
Creare un indice invertito basato su un qualificatore di colonna e valori
La query seguente crea un indice invertito estraendo tutte le coppie chiave-valore da una famiglia di colonne con uno schema flessibile. Utilizza MAP_ENTRIES per ottenere un array di tutti i dati archiviati dalla famiglia di colonne stats_summary, quindi UNNEST per trasformare ogni coppia chiave-valore in una riga separata. L'indice risultante consente ricerche rapide basate su stat_description e stat_value. Se aggiungi nuovi tipi di statistiche alla tabella di origine, Bigtable le include automaticamente nell'indice asincrono.
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
Di conseguenza, ogni coppia chiave-valore della famiglia di colonne stats_summary originale ha una propria riga nella vista materializzata continua:
| stat_description (chiave) | stat_value (chiave) | original_key (chiave) | 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" } |
Per ottenere ricerche rapide sui dati acquisiti da Bigtable come valori, utilizza le nuove chiavi di riga per eseguire query sui dati, come mostrato nell'esempio seguente:
SELECT cell_plan, original_key
FROM `mv_inverted_index`
WHERE stat_description = "connected_cell"
AND stat_value = "2"
Creare una nuova chiave di riga basata sui dati esistenti
L'esempio seguente crea una nuova chiave di indice, total_plan_capacity, classificando i piani tariffari archiviati dalla famiglia di colonne cell_plan. La query utilizza MAP_KEYS per ottenere tutte le chiavi in cell_plan e ARRAY_INCLUDES_ANY per filtrare le chiavi di piani tariffari specifici. Un'istruzione CASE definisce quindi la logica per assegnare una categoria total_plan_capacity basata sulla presenza e sui valori di questi piani tariffari. In questo modo è possibile eseguire ricerche efficienti in base alla capacità combinata del piano tariffario.
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
Creare un indice basato su serie temporali
Bigtable archivia ogni valore della cella e il timestamp associato. Utilizzando il
flag WITH_HISTORY=>TRUE nella clausola FROM, puoi recuperare tutte le
versioni dei dati e i relativi timestamp. La funzione di tabella UNPACK espande quindi i risultati della query in modo che ogni valore con timestamp venga visualizzato nella propria riga con una colonna _timestamp separata. In questo modo puoi creare un indice secondario asincrono in cui la nuova chiave di riga è basata su questi valori di timestamp, consentendo ricerche rapide basate su intervalli di tempo.
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
Creare una voce di indice per elementi e valori in una cella JSON
Bigtable viene spesso utilizzato come archivio di coppie chiave-valore per carichi di lavoro su larga scala, inclusi i dati in formati come JSON. L'esempio seguente mostra come creare un indice secondario asincrono per ricerche rapide dei dati archiviati in JSON. La query utilizza JSON_EXTRACT per estrarre store_id da una stringa JSON all'interno della famiglia di colonne transaction_information in una tabella denominata sales. Questo indice consente di recuperare rapidamente le transazioni di vendita in base a ID negozio specifici.
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;