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;

Passaggi successivi