Consultas assíncronas de índice secundário

Este documento oferece exemplos de padrões de consulta comuns para criar índices secundários assíncronos no Bigtable. Os exemplos usam IDs e valores semelhantes aos de Dados para exemplos. Você pode criar uma tabela de teste para testar as consultas.

Antes de ler esta página, familiarize-se com Criar um índice secundário assíncrono e GoogleSQL para Bigtable.

Exemplo de consultas

Os exemplos a seguir mostram como criar índices secundários assíncronos usando diferentes consultas do GoogleSQL.

Criar um índice invertido com base em um qualificador de coluna e valores

A consulta a seguir cria um índice invertido extraindo todos os pares chave-valor de um grupo de colunas com um esquema flexível. Ele usa MAP_ENTRIES para receber uma matriz de todos os dados armazenados pelo grupo de colunas stats_summary e, em seguida, UNNEST para transformar cada par de chave-valor em uma linha separada. O índice resultante permite pesquisas rápidas com base em stat_description e stat_value. Se você adicionar novos tipos de estatísticas à tabela de origem, o Bigtable os incluirá automaticamente no índice assíncrono.

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

Criar uma nova chave de linha com base em dados atuais

O exemplo a seguir cria uma nova chave de índice, total_plan_capacity, categorizando os planos de dados que o grupo de colunas cell_plan armazena. A consulta usa MAP_KEYS para receber todas as chaves em cell_plan e ARRAY_INCLUDES_ANY para filtrar chaves específicas do plano de dados. Uma instrução CASE define a lógica para atribuir uma categoria total_plan_capacity com base na presença e nos valores desses planos de dados. Isso permite pesquisas eficientes com base na capacidade combinada do plano de dados.

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

Criar um índice com base em série temporal

O Bigtable armazena cada valor de célula e o carimbo de data/hora associado. Ao usar a flag WITH_HISTORY=>TRUE na cláusula FROM, é possível recuperar todas as versões de dados e os carimbos de data/hora delas. A função de tabela UNPACK expande os resultados da consulta para que cada valor com carimbo de data/hora apareça em uma linha própria com uma coluna _timestamp separada. Isso permite criar um índice secundário assíncrono em que a nova chave de linha se baseia nesses valores de carimbo de data/hora, permitindo pesquisas rápidas com base em intervalos de 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

Criar uma entrada de índice para itens e valores em uma célula JSON

O Bigtable é usado com frequência como um armazenamento de chave-valor para cargas de trabalho em grande escala, incluindo dados em formatos como JSON. O exemplo a seguir mostra como criar um índice secundário assíncrono para pesquisas rápidas de dados armazenados em JSON. A consulta usa JSON_EXTRACT para extrair o store_id de uma string JSON no grupo de colunas transaction_information em uma tabela chamada sales. Esse índice permite a recuperação rápida de transações de vendas por IDs de loja específicos.

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;

A seguir