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;