Consultas de vistas materializadas continuas
Para crear una vista materializada continua de una tabla de Bigtable, ejecuta una consulta en SQL que defina la vista materializada continua.
En este documento, se describen conceptos y patrones para ayudarte a preparar tu consulta en SQL de vista materializada continua. Antes de leer este documento, debes estar familiarizado con las Vistas materializadas continuas y GoogleSQL para Bigtable.
Las vistas materializadas continuas usan una sintaxis de SQL restringida. En el siguiente patrón, se muestra cómo compilar una consulta en SQL de vista materializada continua:
SELECT
expression AS alias [, ...]
FROM from_item
[ WHERE bool_expression ]
GROUP BY expression [, ...];
from_item:
{
table_name [ as_alias ]
| field_path
}
as_alias:
[ AS ] alias
Si deseas compilar una consulta en SQL de vista materializada continua como un índice secundario asíncrono, usa la cláusula ORDER BY:
SELECT
expression AS alias [, ...]
FROM from_item
[ WHERE bool_expression ]
ORDER BY expression [, ...];
from_item:
{
table_name [ as_alias ]
| field_path
}
as_alias:
[ AS ] alias
Limitaciones de las consultas
Las siguientes reglas se aplican a una consulta en SQL que se usa para crear una vista materializada continua:
- Debe ser una instrucción
SELECT. - Debe tener una cláusula
GROUP BYo, para las consultas de índice secundario asíncrono, una cláusulaORDER BY, pero no ambas. - Solo debe usar funciones de agregación compatibles.
- Puede tener varias agregaciones por grupo.
Agregaciones compatibles
Puedes usar las siguientes funciones de agregación en una consulta en SQL que define una vista materializada continua:
COUNTSUMMINMAXHLL_COUNT.INITHLL_COUNT.MERGEHLL_COUNT.MERGE_PARTIALANY_VALUEBIT_ANDBIT_ORBIT_XORAVG
Si SELECT COUNT(*), debes definir una clave de fila, como en el siguiente ejemplo:
SELECT
'*' AS _key,
COUNT(*) AS count
FROM
foo
GROUP BY
_key;
Características de SQL no compatibles
No puedes usar las siguientes características de SQL:
- Cualquier característica no compatible con GoogleSQL para Bigtable
ARRAYARRAY_AGGARRAY_CONCAT_AGGCOUNT_IFCURRENT_TIMEy otras funciones no deterministasDATE,DATETIMEcomo columnas de salida (usaTIMESTAMPo almacena una cadena)- Orden
DESCen el resultado - Opción
DISTINCT, como enSUM(*DISTINCT* value)) LIMIT/OFFSETSELECT *- Cláusula
OVERpara crear una agregación de ventanas STRUCT
Tampoco puedes anidar cláusulas GROUP BY o ORDER BY ni crear columnas de mapa. Para conocer otras
limitaciones, consulta
Limitaciones.
Cómo evitar filas excluidas
Las filas de entrada se excluyen de una vista materializada continua en las siguientes circunstancias:
- Se seleccionan más de 1 MiB de datos de la fila. Por ejemplo, si tu
consulta es
SELECT apple AS apples , SUM(banana) AS sum_bananas FROM my_table GROUP BY apples, se excluye de la vista materializada continua cualquier fila que contenga más de 1 MiB de datos en las columnasappleybanana. - Se generan más de 1 MiB de datos de la fila. Esto puede ocurrir cuando usas consultas como
SELECT REPEAT(apple, 1000)o usas constantes grandes. - Se generan más de 10 veces más datos de los que se seleccionaron.
- La consulta no coincide con tus datos. Esto incluiría intentar dividir un cero, un desbordamiento de números enteros o esperar un formato de clave de fila que no se use en cada clave de fila.
Las filas excluidas aumentan la métrica de errores del usuario cuando se procesan por primera vez. Para obtener más información sobre las métricas que pueden ayudarte a supervisar tus vistas materializadas continuas, consulta Métricas.
Detalles de la consulta
En esta sección, se describe una consulta de vista materializada continua y cómo podrían verse los resultados cuando se consulta la vista. Los datos de la tabla de origen son la entrada, y los datos de resultado en la vista materializada continua son la salida. Los datos de salida se agregan o no (en la clave definida).
Declaración SELECT
La instrucción select configura las columnas y las agregaciones que se usan en la vista materializada continua. La instrucción debe usar una cláusula GROUP BY para agregar filas o una cláusula ORDER BY para crear un índice secundario asíncrono.
SELECT * no es compatible, pero SELECT COUNT(*) sí lo es.
Al igual que en una instrucción SELECT típica, puedes tener varias agregaciones por un conjunto de datos agrupados. Las columnas no agrupadas deben ser un resultado de agregación.
Este es un ejemplo de una consulta de agregación GROUP BY estándar en SQL:
SELECT
myfamily["node"] AS node,
myfamily["type"] AS type,
COUNT(clicks) AS clicks_per_key
FROM
mytable
GROUP BY
node,
type
Claves de fila y datos no agregados
Puedes especificar un _key como la clave de fila para una vista materializada continua. De lo contrario, las columnas de la cláusula GROUP BY forman la clave en la vista.
Claves de fila definidas por una columna _key
Como opción, puedes especificar una columna _key cuando defines tu vista materializada continua. (Esto es diferente de la _key
columna que obtienes cuando
ejecutas una consulta en SQL en una tabla de Bigtable). Si especificas un _key, se aplican las siguientes reglas:
- Debes agrupar por
_keyy no puedes agrupar por nada más, excepto (opcionalmente) por_timestamp. Para obtener más información, consulta Marcas de tiempo. - La columna
_keydebe ser de tipoBYTES.
Especificar un _key es útil si planeas leer la vista con ReadRows en lugar de con SQL, ya que te permite controlar el formato de la clave de fila. Por otro lado, es posible que una consulta en SQL a una vista con un _key definido deba decodificar el _key de forma explícita en lugar de solo mostrar columnas de clave estructuradas.
Claves de fila definidas por la cláusula GROUP BY o ORDER BY
Si no especificas un _key, las columnas no agregadas de tu lista SELECT se convierten en la clave de fila en la vista. Puedes asignar a las columnas clave cualquier nombre compatible con las convenciones de SQL. Usa este enfoque si planeas usar SQL para consultar la vista en lugar de una solicitud ReadRows.
Las columnas de salida no agregadas de la lista SELECT deben incluirse en la cláusula GROUP
BY. El orden en el que se escriben las columnas en la cláusula GROUP BY es el orden en el que se almacenan los datos en la clave de fila de la vista materializada continua. Por ejemplo, GROUP BY a, b, c es implícitamente ORDER BY a ASC, b ASC, c
ASC.
Si usas una cláusula ORDER BY en lugar de una cláusula GROUP BY para crear un índice secundario asíncrono, las columnas de tu lista SELECT que forman parte de la cláusula ORDER BY se convierten en la clave de fila en la vista. El orden en el que se escriben las columnas en la cláusula ORDER BY es el orden en el que se almacenan los datos en la clave de fila de la vista materializada continua. Por ejemplo, ORDER BY a, b, c almacena los datos con claves de fila ordenadas por a ASC, luego b ASC y, por último, c ASC.
Tu filtro de SQL debe eliminar los posibles valores NULL o cualquier otro valor no válido que pueda causar errores. Una fila no válida, como una que contiene una columna clave NULL, se omite de los resultados y se cuenta en la métrica materialized_view/user_errors. Para depurar los errores del usuario, intenta ejecutar la consulta en SQL fuera de una vista materializada continua.
Datos agregados
Las columnas agregadas de la consulta definen los cálculos que generan los datos en la vista materializada continua.
El alias de una columna agregada se trata como un calificador de columna en la vista materializada continua.
Considera el siguiente ejemplo:
SELECT
fam["baz"] AS baz,
SUM(fam["foo"]) AS sum_foo,
SUM(fam["bar"]) AS sum_bar
FROM
TABLE
GROUP BY
baz;
El resultado de la consulta tiene las siguientes características:
- El resultado de cada
bazestá en una fila separada en ordenbaz ASC. - Si un
bazdeterminado tiene al menos unfoo, elsum_foode la fila de salida es un valor no NULL. - Si un
bazdeterminado tiene al menos unbar, elsum_barde la fila de salida es un valor no NULL. - Si un
bazdeterminado no tiene ningún valor para ninguna de las columnas, se omite de los resultados.
Luego, si consultas la vista con SELECT *, el resultado es similar al siguiente:
| baz | sum_foo | sum_bar |
|---|---|---|
| baz1 | sum_foo1 | sum_bar1 |
| baz2 | sum_foo2 | sum_bar2 |
Marcas de tiempo
La marca de tiempo predeterminada para una celda de salida en una vista materializada continua es 0 (1970-01-01 00:00:00Z). Esto es visible cuando lees la vista con ReadRows y no cuando la consultas con SQL.
Para usar una marca de tiempo diferente en el resultado, puedes agregar una columna del tipo TIMESTAMP a la lista SELECT de la consulta y llamarla _timestamp.
Si consultas la vista materializada continua con ReadRows, _timestamp se convierte en la marca de tiempo para las otras celdas de la fila.
Una marca de tiempo no debe ser NULL, debe ser mayor o igual que cero y debe ser un múltiplo de 1,000 (precisión de milisegundos). Bigtable no admite marcas de tiempo de celdas anteriores a la época de Unix (1970-01-01T00:00:00Z).
Considera el siguiente ejemplo, que vuelve a muestrear los datos agregados por día. La consulta usa la función UNPACK.
SELECT
_key,
TIMESTAMP_TRUNC(_timestamp, DAY) AS _timestamp,
SUM(sum_family["sum_column"]) AS sum_column,
SUM(sum_family["foo"]) AS second_sum_column
FROM
UNPACK(
SELECT
*
FROM
my_table(with_history => TRUE))
GROUP BY
1,
2
Si un SUM determinado tiene una entrada no vacía para un día determinado, la fila de salida contiene un valor agregado con una marca de tiempo que coincide con el día truncado.
Si consultas la vista con SELECT *, el resultado es similar al siguiente:
| _key | _timestamp | sum_column | second_sum_column |
|---|---|---|---|
| 1 | 2024-05-01 00:00:00Z | 23 | 99 |
| 2 | 2024-05-02 00:00:00Z | 45 | 201 |
| 3 | 2024-05-03 00:00:00Z | NULL | 56 |
| 4 | 2024-05-04 00:00:00Z | 8 | NULL |
Codificación
Si consultas tu vista materializada continua con SQL, no necesitas saber cómo se codifican los valores agregados porque SQL expone los resultados como columnas con tipo.
Si lees desde la vista con ReadRows, debes decodificar los datos agregados en tu solicitud de lectura. Para obtener más información sobre las solicitudes ReadRows, consulta
Lecturas.
Los valores agregados en una vista materializada continua se almacenan con la codificación que se describe en la siguiente tabla, según el tipo de salida de la columna de la definición de la vista.
| Tipo | Codificación |
|---|---|
| BOOL | Valor de 1 byte, 1 = verdadero, 0 = falso |
| BYTES | Sin codificación |
| INT64 (o INT, SMALLINT, INTEGER, BIGINT, TINYINT, BYTEINT) | Big-endian de 64 bits |
| FLOAT64 | IEEE 754 de 64 bits, sin incluir NaN y +/-inf |
| STRING | UTF-8 |
| TIME/TIMESTAMP | Número entero de 64 bits que representa la cantidad de microsegundos desde la época de Unix (coherente con GoogleSQL) |
¿Qué sigue?
- Crea y administra vistas materializadas continuas
- Documentación de referencia de GoogleSQL para Bigtable