Consultas de visualizações materializadas contínuas
Para criar uma visualização materializada contínua de uma tabela do Bigtable, execute uma consulta SQL que define a visualização materializada contínua.
Este documento descreve conceitos e padrões para ajudar você a preparar sua consulta SQL de visualização materializada contínua. Antes de ler este documento, familiarize-se com Visualizações materializadas contínuas e GoogleSQL para Bigtable.
As visualizações materializadas contínuas usam uma sintaxe SQL restrita. O padrão a seguir mostra como criar uma consulta SQL de visualização materializada contínua:
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
Se você quiser criar uma consulta SQL de visualização materializada contínua como um índice secundário global, use a 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
Limitações de consulta
As regras a seguir se aplicam a uma consulta SQL usada para criar uma visualização materializada contínua:
- Precisa ser uma instrução
SELECT
. - Precisa ter uma cláusula
GROUP BY
ou, para consultas de índice secundário global, uma cláusulaORDER BY
, mas não ambas. - Use apenas funções de agregação compatíveis.
- Pode ter várias agregações por grupo.
Agregações compatíveis
É possível usar as seguintes funções de agregação em uma consulta SQL que define uma visualização materializada contínua:
COUNT
SUM
MIN
MAX
HLL_COUNT.INIT
HLL_COUNT.MERGE
HLL_COUNT.MERGE_PARTIAL
ANY_VALUE
BIT_AND
BIT_OR
BIT_XOR
AVG
Se você SELECT COUNT(*)
, defina uma chave de linha, como no exemplo a seguir:
SELECT
'*' AS _key,
COUNT(*) AS count
FROM
foo
GROUP BY
_key;
Recursos do SQL incompatíveis
Não é possível usar os seguintes recursos de SQL:
- Qualquer recurso não compatível com o GoogleSQL para Bigtable
ARRAY
ARRAY_AGG
ARRAY_CONCAT_AGG
COUNT_IF
CURRENT_TIME
e outras funções não determinísticasDATE
,DATETIME
como colunas de saída (useTIMESTAMP
ou armazene uma string).DESC
na saídaDISTINCT
, como emSUM(*DISTINCT* value)
)LIMIT/OFFSET
SELECT *
- Cláusula
OVER
para criar uma agregação de janela STRUCT
Também não é possível aninhar cláusulas GROUP BY
ou ORDER BY
nem criar colunas de mapa. Para mais limitações, consulte
Limitações.
Evitar linhas excluídas
As linhas de entrada são excluídas de uma visualização materializada contínua nas seguintes circunstâncias:
- Mais de 1 MiB de dados é selecionado da linha. Por exemplo, se a consulta for
SELECT apple AS apples , SUM(banana) AS sum_bananas FROM my_table GROUP BY apples
, qualquer linha que contenha mais de 1 MiB de dados nas colunasapple
ebanana
será excluída da visualização materializada contínua. - Mais de 1 MiB de dados são gerados da linha. Isso pode acontecer quando você usa consultas como
SELECT REPEAT(apple, 1000)
ou constantes grandes. - Mais de 10 vezes mais dados são gerados do que foram selecionados.
- A consulta não corresponde aos seus dados. Isso inclui tentar dividir um zero, estouro de número inteiro ou esperar um formato de chave de linha que não seja usado em todas as chaves de linha.
As linhas excluídas incrementam a métrica de erros do usuário quando são processadas pela primeira vez. Para mais informações sobre métricas que podem ajudar você a monitorar suas visualizações materializadas contínuas, consulte Métricas.
Detalhes da consulta
Esta seção descreve uma consulta de visualização materializada contínua e como os resultados podem aparecer quando a visualização é consultada. Os dados na tabela de origem são a entrada, e os dados de resultado na visualização materializada contínua são a saída. Os dados de saída são agregados ou não agregados (na chave definida).
Instrução SELECT
A instrução SELECT configura as colunas e agregações usadas na visualização materializada contínua. A instrução precisa usar uma cláusula GROUP BY
para agregar em várias linhas ou uma cláusula ORDER BY
para criar um índice secundário global.
SELECT *
não é compatível, mas SELECT COUNT(*)
é.
Como em uma instrução SELECT
típica, é possível ter várias agregações por um conjunto agrupado de dados. As colunas não agrupadas precisam ser um resultado de agregação.
Este é um exemplo de uma consulta de agregação GROUP BY
padrão em SQL:
SELECT
myfamily["node"] AS node,
myfamily["type"] AS type,
COUNT(clicks) AS clicks_per_key
FROM
mytable
GROUP BY
node,
type
Chaves de linha e dados não agregados
É possível especificar um _key
como a chave de linha de uma visualização materializada contínua. Caso contrário, as colunas na cláusula GROUP BY
formam a chave na visualização.
Chaves de linha definidas por uma coluna _key
É possível especificar uma coluna _key
ao definir sua visualização materializada contínua. Isso é diferente da coluna _key
que você recebe ao executar uma consulta SQL em uma tabela do Bigtable. Se você especificar um _key
, as seguintes regras serão aplicadas:
- Você precisa agrupar por
_key
, e não é possível agrupar por mais nada, exceto (opcionalmente) por_timestamp
. Para mais informações, consulte Carimbos de data/hora. - A coluna
_key
precisa ser do tipoBYTES
.
Especificar um _key
é útil se você planeja ler a visualização com ReadRows
em vez de SQL, porque isso dá controle sobre o formato da chave de linha. Por outro lado, uma consulta SQL em uma visualização com um _key
definido pode precisar decodificar o _key
explicitamente em vez de apenas retornar colunas de chave estruturadas.
Chaves de linha definidas pela cláusula GROUP BY
ou ORDER BY
Se você não especificar um _key
, as colunas não agregadas na sua lista SELECT
vão se tornar a chave de linha na visualização. É possível atribuir às colunas de chave qualquer nome compatível com as convenções de SQL. Use essa abordagem se você planeja usar SQL para consultar a visualização em vez de uma solicitação ReadRows
.
As colunas de saída não agregadas na lista SELECT
precisam ser incluídas na cláusula GROUP
BY
. A ordem em que as colunas são gravadas na cláusula GROUP BY
é a ordem em que os dados são armazenados na chave de linha da visualização materializada contínua. Por exemplo, GROUP BY a, b, c
é implicitamente ORDER BY a ASC, b ASC, c
ASC
.
Se você usar uma cláusula ORDER BY
em vez de uma GROUP BY
para criar um índice secundário global, as colunas na lista SELECT
que fazem parte da cláusula ORDER BY
se tornarão a chave de linha na visualização. A ordem em que as colunas
são gravadas na cláusula ORDER BY
é a ordem em que os dados são armazenados
na chave de linha da visualização materializada contínua. Por exemplo, ORDER BY a, b, c
armazena os dados com chaves de linha ordenadas por a ASC
, depois b ASC
e c ASC
.
O filtro SQL precisa eliminar possíveis NULL
ou outros valores inválidos que podem causar erros. Uma linha inválida, como uma que contém uma coluna de chave NULL
, é omitida dos resultados e contada na métrica materialized_view/user_errors
. Para depurar erros do usuário, execute a consulta SQL fora de uma visualização materializada contínua.
Dados agregados
As colunas de agregação na consulta definem os cálculos que geram os dados na visualização materializada contínua.
O alias de uma coluna agregada é tratado como um qualificador de coluna na visualização materializada contínua.
Veja o exemplo a seguir.
SELECT
fam["baz"] AS baz,
SUM(fam["foo"]) AS sum_foo,
SUM(fam["bar"]) AS sum_bar
FROM
TABLE
GROUP BY
baz;
A saída da consulta tem as seguintes características:
- A saída para cada
baz
está em uma linha separada na ordembaz ASC
. - Se um determinado
baz
tiver pelo menos umfoo
, osum_foo
da linha de saída será um valor não nulo. - Se um determinado
baz
tiver pelo menos umbar
, osum_bar
da linha de saída será um valor não nulo. - Se um determinado
baz
não tiver valor em nenhuma das colunas, ele será omitido dos resultados.
Se você consultar a visualização com SELECT *
, o resultado será semelhante a este:
baz | sum_foo | sum_bar |
---|---|---|
baz1 | sum_foo1 | sum_bar1 |
baz2 | sum_foo2 | sum_bar2 |
Carimbos de data/hora
O carimbo de data/hora padrão de uma célula de saída em uma visualização materializada contínua é 0 (1970-01-01 00:00:00Z
). Isso fica visível quando você lê a visualização com ReadRows
, e não quando a consulta com SQL.
Para usar um carimbo de data/hora diferente na saída, adicione uma coluna do tipo TIMESTAMP
à lista SELECT
da consulta e nomeie-a como _timestamp
.
Se você consultar a visualização materializada contínua usando ReadRows
, _timestamp
vai se tornar o carimbo de data/hora das outras células na linha.
Um carimbo de data/hora não pode ser NULL
, precisa ser maior ou igual a zero e precisa ser um múltiplo de 1.000 (precisão de milissegundos). O Bigtable não aceita carimbos de data/hora de células anteriores à época do Unix (1970-01-01T00:00:00Z).
Considere o exemplo a seguir, que faz uma reamostragem dos dados agregados por dia. A consulta usa a função 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
Se um determinado SUM
tiver uma entrada não vazia para um determinado dia, a linha de saída vai conter um valor agregado com um carimbo de data/hora que corresponde ao dia truncado.
Se você consultar a visualização com SELECT *
, o resultado será semelhante a este:
_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 |
Codificação
Se você consultar sua visualização materializada contínua com SQL, não precisará saber como os valores agregados são codificados, porque o SQL expõe os resultados como colunas tipadas.
Se você ler da visualização usando ReadRows
, precisará decodificar os dados agregados na sua solicitação de leitura. Para mais informações sobre solicitações ReadRows
, consulte
Leituras.
Os valores agregados em uma visualização materializada contínua são armazenados usando a codificação descrita na tabela a seguir, com base no tipo de saída da coluna da definição da visualização.
Tipo | Codificação |
---|---|
BOOL | Valor de 1 byte, 1 = verdadeiro, 0 = falso |
BYTES | Sem codificação |
INT64 (ou INT, SMALLINT, INTEGER, BIGINT, TINYINT, BYTEINT) | Big-endian de 64 bits |
FLOAT64 | IEEE 754 de 64 bits, excluindo NaN e +/-inf |
STRING | UTF-8 |
HORA/CARIMBO DE DATA/HORA | Número inteiro de 64 bits que representa o número de microssegundos desde a época do Unix (compatível com o GoogleSQL). |
A seguir
- Criar e gerenciar visualizações materializadas contínuas
- Documentação de referência do GoogleSQL para Bigtable