Consultas de índice secundário assíncronas

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

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

Consultas de exemplo

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

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

A consulta seguinte cria um índice invertido extraindo todos os pares de chave-valor de uma família de colunas com um esquema flexível. Usa MAP_ENTRIES para obter uma matriz de todos os dados que a família de colunas stats_summary armazena e, em seguida, UNNEST para transformar cada par de chave/valor numa linha separada. O índice resultante permite pesquisas rápidas com base em stat_description e stat_value. Se adicionar novos tipos de estatísticas à tabela de origem, o Bigtable inclui-os 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

Como resultado, cada par de chave-valor da família de colunas stats_summary original tem a sua própria linha na vista materializada contínua:

stat_description (key) stat_value (key) original_key (chave) 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" }

Para obter pesquisas rápidas em dados que o Bigtable capturou como valores, use as novas chaves de linhas para consultar os dados, conforme mostrado no exemplo seguinte:

SELECT cell_plan, original_key
FROM `mv_inverted_index`
WHERE stat_description = "connected_cell"
AND stat_value = "2"

Crie uma nova chave de linha com base em dados existentes

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

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

Crie um índice baseado em séries temporais

O Bigtable armazena cada valor de célula e o respetivo carimbo de data/hora associado. Se usar a flag WITH_HISTORY=>TRUE na cláusula FROM, pode obter todas as versões dos dados e as respetivas indicações de tempo. A função de tabela UNPACK expande, em seguida, os resultados da consulta para que cada valor com data/hora apareça na sua própria linha com uma coluna _timestamp separada. Isto permite-lhe criar um índice secundário assíncrono em que a nova chave de linha se baseia nestes valores de data/hora, o que permite pesquisas rápidas baseadas 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

Crie uma entrada de índice para itens e valores numa célula JSON

O Bigtable é frequentemente usado como um armazenamento de chave-valor para cargas de trabalho de grande escala, incluindo dados em formatos como JSON. O exemplo seguinte mostra como criar um índice secundário assíncrono para pesquisas rápidas de dados que o JSON armazena. A consulta usa JSON_EXTRACT para extrair o store_id de uma string JSON na família de colunas transaction_information numa tabela denominada sales. Este índice permite uma obtenção rápida de transações de vendas por IDs de lojas 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;

O que se segue?