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áusula ORDER 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ísticas
  • DATE, DATETIME como colunas de saída (use TIMESTAMP ou armazene uma string).
  • DESC ordenar na saída
  • DISTINCT, como em SUM(*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 colunas apple e banana é 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 tipo BYTES.

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 de baz ASC.
  • Se um determinado baz tiver, pelo menos, um foo, o sum_foo da linha de saída é um valor não NULO.
  • Se um determinado baz tiver, pelo menos, um bar, o sum_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 ReadRowspedidos, 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)
Para mais informações, consulte a secção Codificação na referência da API Data.

O que se segue?