Consultas asíncronas de índices secundarios

En este documento, se proporcionan ejemplos de patrones de consultas comunes para crear índices secundarios asíncronos en Bigtable. En los ejemplos, se usan IDs y valores similares a los de Datos para ejemplos, y puedes crear una tabla de prueba para probar las consultas.

Antes de leer esta página, familiarízate con Cómo crear un índice secundario asíncrono y GoogleSQL para Bigtable.

Consultas de ejemplo

En los siguientes ejemplos, se muestra cómo crear índices secundarios asíncronos con diferentes consultas de GoogleSQL.

Crea un índice invertido basado en un calificador y valores de columna

La siguiente consulta crea un índice invertido extrayendo todos los pares clave-valor de una familia de columnas que tiene un esquema flexible. Utiliza MAP_ENTRIES para obtener un array de todos los datos que almacena la familia de columnas stats_summary y, luego, UNNEST para transformar cada par clave-valor en una fila separada. El índice resultante permite búsquedas rápidas basadas en stat_description y stat_value. Si agregas nuevos tipos de estadísticas a la tabla de origen, Bigtable las incluirá automáticamente en el índice así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

Crea una clave de fila nueva basada en datos existentes

En el siguiente ejemplo, se crea una nueva clave de índice, total_plan_capacity, categorizando los planes de datos que almacena la familia de columnas cell_plan. La consulta usa MAP_KEYS para obtener todas las claves en cell_plan y ARRAY_INCLUDES_ANY para filtrar claves de planes de datos específicos. Luego, una instrucción CASE define la lógica para asignar una categoría total_plan_capacity basada en la presencia y los valores de estos planes de datos, lo que permite búsquedas eficientes basadas en la capacidad combinada del plan de datos.

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

Crea un índice basado en series temporales

Bigtable almacena cada valor de celda y su marca de tiempo asociada. Si usas la marca WITH_HISTORY=>TRUE en la cláusula FROM, puedes recuperar todas las versiones de los datos y sus marcas de tiempo. Luego, la función de tabla UNPACK expande los resultados de la consulta para que cada valor con marca de tiempo aparezca en su propia fila con una columna _timestamp separada. Esto te permite crear un índice secundario asíncrono en el que la nueva clave de fila se basa en estos valores de marca de tiempo, lo que permite búsquedas rápidas basadas en rangos de tiempo.

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

Crea una entrada de índice para elementos y valores en una celda JSON

Bigtable se suele usar como un almacén de clave-valor para cargas de trabajo a gran escala, incluidos los datos en formatos como JSON. En el siguiente ejemplo, se muestra cómo crear un índice secundario asíncrono para búsquedas rápidas de datos que almacena JSON. La consulta usa JSON_EXTRACT para extraer el store_id de una cadena JSON dentro de la familia de columnas transaction_information en una tabla llamada sales. Este índice permite recuperar rápidamente las transacciones de ventas por IDs de tienda 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;

¿Qué sigue?