Requêtes asynchrones d'index secondaires

Ce document fournit des exemples de modèles de requêtes courants pour créer des index secondaires asynchrones dans Bigtable. Les exemples utilisent des ID et des valeurs semblables à ceux de la section Données pour les exemples. Vous pouvez créer une table de test pour tester les requêtes.

Avant de lire cette page, familiarisez-vous avec Créer un index secondaire asynchrone et GoogleSQL pour Bigtable.

Exemples de requêtes

Les exemples suivants montrent comment créer des index secondaires asynchrones à l'aide de différentes requêtes GoogleSQL.

Créer un index inversé basé sur un qualificatif et des valeurs de colonne

La requête suivante crée un index inversé en extrayant toutes les paires clé/valeur d'une famille de colonnes dotée d'un schéma flexible. Elle utilise MAP_ENTRIES pour obtenir un tableau de toutes les données stockées par la famille de colonnes stats_summary, puis UNNEST pour transformer chaque paire clé-valeur en ligne distincte. L'index obtenu permet des recherches rapides basées sur stat_description et stat_value. Si vous ajoutez de nouveaux types de statistiques à la table source, Bigtable les inclut automatiquement dans l'index asynchrone.

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

Créer une clé de ligne à partir de données existantes

L'exemple suivant crée une clé d'index, total_plan_capacity, en catégorisant les forfaits de données stockés par la famille de colonnes cell_plan. La requête utilise MAP_KEYS pour obtenir toutes les clés dans cell_plan et ARRAY_INCLUDES_ANY pour filtrer les clés de forfait de données spécifiques. Une instruction CASE définit ensuite la logique permettant d'attribuer une catégorie total_plan_capacity en fonction de la présence et des valeurs de ces forfaits de données. Cela permet d'effectuer des recherches efficaces en fonction de la capacité combinée des forfaits de données.

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

Créer un index basé sur les séries temporelles

Bigtable stocke chaque valeur de cellule et son code temporel associé. En utilisant l'indicateur WITH_HISTORY=>TRUE dans la clause FROM, vous pouvez récupérer toutes les versions des données et leurs codes temporels. La fonction de table UNPACK développe ensuite les résultats de la requête afin que chaque valeur horodatée apparaisse sur sa propre ligne avec une colonne _timestamp distincte. Cela vous permet de créer un index secondaire asynchrone où la nouvelle clé de ligne est basée sur ces valeurs d'horodatage, ce qui permet des recherches rapides basées sur des plages de temps.

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

Créer une entrée d'index pour les éléments et les valeurs d'une cellule JSON

Bigtable est souvent utilisé comme magasin clé-valeur pour les charges de travail à grande échelle, y compris les données dans des formats tels que JSON. L'exemple suivant montre comment créer un index secondaire asynchrone pour des recherches rapides dans les données stockées par JSON. La requête utilise JSON_EXTRACT pour extraire store_id d'une chaîne JSON dans la famille de colonnes transaction_information d'une table nommée sales. Cet index permet de récupérer rapidement les transactions de vente par ID de magasin spécifique.

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;

Étapes suivantes