Consultas de índice secundario asíncronas
En este documento se proporcionan ejemplos de patrones de consulta habituales 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 los artículos 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 mediante diferentes consultas de GoogleSQL.
Crear un índice invertido basado en un calificador de columna y valores
La siguiente consulta crea un índice invertido extrayendo todos los pares clave-valor de una familia de columnas que tiene un esquema flexible. Usa MAP_ENTRIES
para obtener una matriz de todos los datos que almacena la familia de columnas stats_summary
y, a continuación, UNNEST
para transformar cada par clave-valor en una fila independiente. El índice resultante permite realizar búsquedas rápidas basadas en stat_description
y stat_value
. Si añade nuevos tipos de estadísticas a la tabla de origen, Bigtable los 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
Por lo tanto, cada par clave-valor de la familia de columnas stats_summary
original tiene su propia fila en la vista materializada continua:
stat_description (clave) | stat_value (clave) | original_key (clave) | 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 obtener búsquedas rápidas de los datos que Bigtable ha capturado como valores, utilice las nuevas claves de fila para consultar los datos, tal como se muestra en el siguiente ejemplo:
SELECT cell_plan, original_key
FROM `mv_inverted_index`
WHERE stat_description = "connected_cell"
AND stat_value = "2"
Crear una clave de fila a partir de datos ya disponibles
En el siguiente ejemplo se crea una 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 de cell_plan
y ARRAY_INCLUDES_ANY
para filtrar claves de planes de datos específicos. 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. Esto permite realizar 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
Crear un índice basado en una serie temporal
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. La función de tabla UNPACK
amplía los resultados de la consulta para que cada valor con marca de tiempo aparezca en su propia fila con una columna _timestamp
independiente. De esta forma, puedes 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 realizar búsquedas rápidas basadas en intervalos 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
Crear una entrada de índice para elementos y valores de una celda JSON
Bigtable se suele usar como un almacén de clave-valor para cargas de trabajo a gran escala, incluidos datos en formatos como JSON. En el siguiente ejemplo se muestra cómo crear un índice secundario asíncrono para buscar rápidamente datos que almacena JSON. La consulta usa JSON_EXTRACT
para extraer el store_id
de una cadena JSON de la familia de columnas transaction_information
de 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;