Consultas de vistas materializadas contínuas
Para criar uma vista materializada contínua de uma tabela do Bigtable, execute uma consulta SQL que define a vista materializada contínua.
Este documento descreve conceitos e padrões para ajudar a preparar a consulta SQL da vista materializada contínua. Antes de ler este documento, deve estar familiarizado com as vistas materializadas contínuas e o GoogleSQL para Bigtable.
As vistas materializadas contínuas usam uma sintaxe SQL restrita. O padrão seguinte 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 quiser criar uma consulta SQL de vista materializada contínua como um índice secundário assíncrono, 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 das consultas
As seguintes regras aplicam-se a uma consulta SQL usada para criar uma vista materializada contínua:
- Tem de ser uma declaração
SELECT
. - Tem de ter uma cláusula
GROUP BY
ou, para consultas de índice secundário assíncronas, uma cláusulaORDER BY
, mas não ambas. - Tem de usar apenas funções de agregação suportadas.
- Pode ter várias agregações por grupo.
Agregações suportadas
Pode usar as seguintes funções de agregação numa consulta SQL que define uma vista 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 SELECT COUNT(*)
, tem de definir uma chave de linha, como no seguinte exemplo:
SELECT
'*' AS _key,
COUNT(*) AS count
FROM
foo
GROUP BY
_key;
Funcionalidades SQL não suportadas
Não pode usar as seguintes funcionalidades SQL:
- Qualquer funcionalidade não suportada pelo 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
ordenar na saídaDISTINCT
, como emSUM(*DISTINCT* value)
)LIMIT/OFFSET
SELECT *
- cláusula
OVER
para criar uma agregação de janelas STRUCT
Também não pode aninhar cláusulas GROUP BY
ou ORDER BY
, nem criar colunas de mapas. Para ver limitações
adicionais, consulte a secção
Limitações.
Evitar linhas excluídas
As linhas de entrada são excluídas de uma vista materializada contínua nas seguintes circunstâncias:
- É selecionado mais de 1 MiB de dados da linha. Por exemplo, se a sua 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
é excluída da vista materializada contínua. - A linha produz mais de 1 MiB de dados. Isto pode ocorrer quando usa consultas como
SELECT REPEAT(apple, 1000)
ou usa constantes grandes. - É gerada uma quantidade de dados mais de 10 vezes superior à selecionada.
- A consulta não corresponde aos seus dados. Isto inclui tentar dividir por zero, um excesso de capacidade de números inteiros 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 utilizador quando são processadas pela primeira vez. Para mais informações sobre as métricas que podem ajudar a monitorizar as vistas materializadas contínuas, consulte o artigo Métricas.
Detalhes da consulta
Esta secção descreve uma consulta de vista materializada contínua e o aspeto dos resultados quando a vista é consultada. Os dados na tabela de origem são a entrada, e os dados de resultados na vista materializada contínua são a saída. Os dados de saída são agregados ou não agregados (na chave definida).
Declaração SELECT
A declaração SELECT configura as colunas e as agregações usadas na vista materializada contínua. A declaração tem de usar uma cláusula GROUP BY
para agregar linhas ou uma cláusula ORDER BY
para criar um índice secundário assíncrono.
O SELECT *
não é suportado, mas o SELECT COUNT(*)
é.
Tal como numa declaração SELECT
típica, pode ter várias agregações por um conjunto de dados agrupados. As colunas não agrupadas têm de 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 linhas e dados não agregados
Pode especificar um _key
como a chave da linha para uma vista materializada contínua. Caso contrário, as colunas na cláusula GROUP BY
formam a chave na vista.
Chaves de linhas definidas por uma coluna _key
Opcionalmente, pode especificar uma coluna _key
quando define a vista materializada contínua. (Isto é diferente da coluna _key
que recebe quando executa uma consulta SQL numa tabela do Bigtable.) Se especificar um
_key
, aplicam-se as seguintes regras:
- Tem de agrupar por
_key
e não pode agrupar por mais nada, exceto (opcionalmente) por_timestamp
. Para mais informações, consulte o artigo Indicações de tempo. - A coluna
_key
tem de ser do tipoBYTES
.
A especificação de um _key
é útil se planear ler a vista com ReadRows
em vez de com SQL, porque lhe dá controlo sobre o formato da chave da linha. Por outro lado, uma consulta SQL a uma vista com um _key
definido pode ter de descodificar o _key
explicitamente em vez de apenas devolver colunas de chaves estruturadas.
Chaves de linhas definidas pela cláusula GROUP BY
ou ORDER BY
Se não especificar um _key
, as colunas não agregadas na sua lista SELECT
tornam-se a chave da linha na vista. Pode atribuir às colunas de chaves quaisquer nomes suportados pelas convenções SQL. Use esta abordagem se planear usar SQL para consultar a vista em vez de um pedido ReadRows
.
As colunas de saída não agregadas na lista SELECT
têm de ser incluídas na cláusula GROUP
BY
. A ordem em que as colunas são escritas na cláusula GROUP BY
é a ordem em que os dados são armazenados na chave de linha da vista materializada contínua. Por exemplo, GROUP BY a, b, c
é implicitamente ORDER BY a ASC, b ASC, c
ASC
.
Se usar uma cláusula ORDER BY
em vez de uma cláusula GROUP BY
para criar um índice secundário assíncrono, as colunas na sua lista SELECT
que fazem parte da cláusula ORDER BY
tornam-se a chave da linha na vista. A ordem em que as colunas são escritas na cláusula ORDER BY
é a ordem em que os dados são armazenados na chave de linha da vista materializada contínua. Por exemplo, ORDER BY a, b, c
armazena os dados com chaves de linhas ordenadas por a ASC
, depois b ASC
e, por fim, c ASC
.
O filtro SQL tem de eliminar potenciais NULL
ou outros valores inválidos que possam
causar erros. Uma linha inválida, como uma que contenha uma coluna de chave NULL
, é omitida dos resultados e contabilizada na métrica materialized_view/user_errors
. Para depurar erros do utilizador, experimente executar a consulta SQL fora de uma vista materializada contínua.
Dados agregados
As colunas de agregação na consulta definem os cálculos que geram os dados na vista materializada contínua.
O alias de uma coluna agregada é tratado como um qualificador de coluna na vista materializada contínua.
Considere o seguinte exemplo:
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:
- O resultado de cada
baz
está numa linha separada pela ordem debaz ASC
. - Se um determinado
baz
tiver, pelo menos, umfoo
, osum_foo
da linha de saída é um valor não NULO. - Se um determinado
baz
tiver, pelo menos, umbar
, osum_bar
da linha de saída é um valor não NULO. - Se um determinado
baz
não tiver um valor para nenhuma das colunas, é omitido dos resultados.
Em seguida, se consultar a vista com SELECT *
, o resultado tem um aspeto semelhante ao seguinte:
baz | sum_foo | sum_bar |
---|---|---|
baz1 | sum_foo1 | sum_bar1 |
baz2 | sum_foo2 | sum_bar2 |
Indicações de tempo
A data/hora predefinida para uma célula de saída numa vista materializada contínua é 0 (1970-01-01 00:00:00Z
). Isto é visível quando lê a vista com ReadRows
e não quando a consulta com SQL.
Para usar uma data/hora diferente na saída, pode adicionar uma coluna do tipo TIMESTAMP
à lista SELECT
da consulta e atribuir-lhe o nome _timestamp
.
Se consultar a vista materializada contínua através de ReadRows
, _timestamp
torna-se a data/hora das outras células na linha.
Uma data/hora não pode ser NULL
, tem de ser igual ou superior a zero e tem de ser um múltiplo de 1000 (precisão de milissegundos). O Bigtable não suporta
datas/horas das células anteriores à época Unix (1970-01-01T00:00:00Z).
Considere o seguinte exemplo, que cria novas amostras de 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 contém um valor agregado com uma data/hora que corresponde ao dia truncado.
Se consultar a vista com SELECT *
, o resultado é semelhante ao seguinte:
_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 consultar a sua vista materializada contínua com SQL, não precisa de saber como os valores agregados são codificados, porque o SQL expõe os resultados como colunas com tipo.
Se ler a partir da vista através da ReadRows
, tem de descodificar os dados agregados no seu pedido de leitura. Para mais informações sobre ReadRows
pedidos, consulte o artigo
Leituras.
Os valores agregados numa vista materializada contínua são armazenados através da codificação descrita na tabela seguinte, com base no tipo de saída da coluna da definição da vista.
Tipo | Codificação |
---|---|
BOOL | Valor de 1 byte, 1 = verdadeiro, 0 = falso |
BYTES | Sem codificação |
INT64 (ou INT, SMALLINT, INTEGER, BIGINT, TINYINT, BYTEINT) | 64 bits big-endian |
FLOAT64 | IEEE 754 de 64 bits, excluindo NaN e +/-inf |
STRING | UTF-8 |
HORA/INDICAÇÃO DE TEMPO | Número inteiro de 64 bits que representa o número de microssegundos desde a época Unix (consistente com o GoogleSQL) |
O que se segue?
- Crie e faça a gestão de visualizações materializadas contínuas
- Documentação de referência do GoogleSQL para Bigtable