Query sulle viste materializzate continue

Per creare una vista materializzata continua di una tabella Bigtable, esegui una query SQL che definisce la vista materializzata continua.

Questo documento descrive concetti e pattern per aiutarti a preparare la query SQL della vista materializzata continua. Prima di leggere questo documento, è necessario conoscere le viste materializzate continue e GoogleSQL per Bigtable.

Le viste materializzate continue utilizzano una sintassi SQL limitata. Le query devono utilizzare il seguente schema:

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

Limitazioni per le query

Le seguenti regole si applicano a una query SQL utilizzata per creare una vista materializzata continua:

  • Deve essere un'istruzione SELECT
  • Deve contenere una clausola GROUP BY
  • Devono essere utilizzate solo le funzioni di aggregazione supportate
  • Devi definire almeno una colonna di aggregazione
  • Può avere più aggregazioni per gruppo

Aggregazioni supportate

Puoi utilizzare le seguenti funzioni di aggregazione in una query SQL che definisce una visualizzazione materializzata continua:

  • 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(*), devi definire una chiave di riga, come nell'esempio seguente:

SELECT
  '*' AS _key,
  COUNT(*) AS count
FROM
  foo
GROUP BY
  _key;

Funzionalità SQL non supportate

Non puoi utilizzare le seguenti funzionalità SQL:

  • Qualsiasi funzionalità non supportata da GoogleSQL per Bigtable
  • ARRAY
  • ARRAY_AGG
  • ARRAY_CONCAT_AGG
  • COUNT_IF
  • CURRENT_TIME e altre funzioni non deterministiche
  • DATE, DATETIME come colonne di output (utilizza TIMESTAMP o memorizza una stringa).
  • DESC ordinamento nell'output
  • DISTINCT, come in SUM(*DISTINCT* value))
  • LIMIT/OFFSET
  • ORDER BY
  • SELECT *
  • Clausola OVER per creare un'aggregazione con finestre
  • STRUCT

Inoltre, non puoi nidificare clausole GROUP BY o creare colonne mappa. Per altre limitazioni, consulta Limitazioni.

Evitare righe escluse

Le righe di input vengono escluse da una vista materializzata continua nelle seguenti circostanze:

  • Nella riga sono selezionati più di 1 MiB di dati. Ad esempio, se la query è SELECT apple AS apples , SUM(banana) AS sum_bananas FROM my_table GROUP BY apples, qualsiasi riga contenente più di 1 MiB di dati nelle colonne apple e banana viene esclusa dalla vista materializzata continua.
  • La riga genera più di 1 MiB di dati. Ciò può verificarsi quando utilizzi query come SELECT REPEAT(apple, 1000) o utilizzi costanti di grandi dimensioni.
  • Vengono generati più di 10 volte più dati rispetto a quelli selezionati.
  • La query non corrisponde ai tuoi dati. Ad esempio, il tentativo di dividere per zero, un overflow di interi o l'attesa di un formato della chiave di riga non utilizzato in ogni chiave di riga.

Le righe escluse incrementano la metrica Errori utente al primo trattamento. Per ulteriori informazioni sulle metriche che possono aiutarti a monitorare le visualizzazioni materializzate continue, consulta Metriche.

Dettagli query

Questa sezione descrive una query sulla vista materializzata continua e l'aspetto dei risultati quando viene eseguita la query sulla vista. I dati nella tabella di origine sono input e i dati del risultato nella vista materializzata continua sono output. I dati di output sono aggregati o non aggregati (nella chiave definita).

Istruzione SELECT

La clausola select configura le colonne e le aggregazioni utilizzate nella visualizzazione materializzata continua e deve utilizzare una clausola GROUP BY.

SELECT * non è supportato, ma SELECT COUNT(*) sì.

Come in un'istruzione SELECT tipica, puoi avere più aggregazioni per un insieme di dati raggruppati. Le colonne non raggruppate devono essere un risultato di aggregazione.

Questo è un esempio di query di aggregazione GROUP BY standard in SQL:

SELECT
  myfamily["node"] AS node,
  myfamily["type"] AS type,
  COUNT(clicks) AS clicks_per_key
FROM
  mytable
GROUP BY
  node,
  type

Chiavi di riga e dati non aggregati

Se vuoi, puoi specificare una colonna di output _key come quando definisci la vista materializzata continua. È diversa dalla colonna _key che ottieni quando esegui una query SQL su una tabella Bigtable. Se specifichi un valore _key, si applicano le seguenti regole:

  • Devi raggruppare per _key e non puoi raggruppare per nessun altro elemento, tranne che (facoltativo) per _timestamp. Per ulteriori informazioni, consulta la sezione Timestamp.
  • La colonna _key deve essere di tipo BYTES.

La specifica di un _key è utile se prevedi di leggere la vista con ReadRows piuttosto che con SQL, perché ti consente di controllare il formato della chiave di riga. D'altra parte, una query SQL a una vista con un _key definito potrebbe dover decodificare il _key esplicitamente anziché restituire solo colonne chiave strutturate.

Se non utilizzi _key, le colonne non aggregate nell'istruzione SELECT diventano la chiave nella vista materializzata continua e puoi assegnare alle colonne chiave qualsiasi nome supportato dalle convenzioni SQL.

Il filtro SQL deve eliminare potenziali valori NULL o altri valori non validi che possono causare errori. Una riga non valida viene omessa dai risultati e conteggiata nella metrica materialized_view/user_errors. Per eseguire il debug degli errori utente, prova a eseguire la query SQL al di fuori di una vista materializzata continua.

Le colonne di output non aggregate devono trovarsi nella clausola GROUP BY. L'ordine in cui vengono scritte le colonne nella clausola GROUP BY è l'ordine in cui i dati vengono memorizzati nella chiave di riga della vista materializzata continua. Ad esempio, GROUP BY a, b, c è implicitamente ORDER BY a ASC, b ASC, c ASC.

Dati aggregati

Le colonne aggregate nella query definiscono i calcoli che generano i dati nella vista materializzata continua.

L'alias di una colonna aggregata viene trattato come un qualificatore di colonna nella vista materializzata continua.

Considera l'esempio seguente:

SELECT
  fam["baz"] AS baz,
  SUM(fam["foo"]) AS sum_foo,
  SUM(fam["bar"]) AS sum_bar
FROM
  TABLE
GROUP BY
  baz;

L'output della query ha le seguenti caratteristiche:

  • L'output per ogni baz si trova in una riga separata in ordine baz ASC.
  • Se un determinato baz ha almeno un foo, sum_foo della riga di output è un valore diverso da NULL.
  • Se un determinato baz ha almeno un bar, sum_bar della riga di output è un valore diverso da NULL.
  • Se un determinato baz non ha un valore per nessuna colonna, viene omesso dai risultati.

Se esegui una query sulla visualizzazione con SELECT *, il risultato sarà simile al seguente:

baz sum_foo sum_bar
baz1 sum_foo1 sum_bar1
baz2 sum_foo2 barra_somma2

Timestamp

Il timestamp predefinito per una cella di output in una vista materializzata continua è 0 (1970-01-01 00:00:00Z). Questo valore è visibile quando leggi la vista con ReadRows e non quando esegui query con SQL.

Per utilizzare un timestamp diverso nell'output, puoi aggiungere una colonna di tipo TIMESTAMP all'elenco SELECT della query e rinominarla _timestamp. Se esegui una query sulla vista materializzata continua utilizzando ReadRows, _timestamp diventa il timestamp per le altre celle della riga.

Un timestamp non deve essere NULL, deve essere maggiore o uguale a zero e deve essere un multiplo di 1000 (precisione in millisecondi). Bigtable non supporta i timestamp delle celle precedenti all'epoca di Unix (1970-01-01T00:00:00Z).

Considera l'esempio seguente, che esegue il ricalcolo dei dati aggregati in base al giorno. La query utilizza la funzione 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 un determinato SUM ha un input non vuoto per un determinato giorno, la riga di output contiene un valore aggregato con un timestamp corrispondente al giorno troncato.

Se esegui una query sulla visualizzazione con SELECT *, il risultato sarà simile al seguente:

_key _timestamp colonna_somma second_sum_column
1 01/05/2024 00:00:00Z 23 99
2 02/05/2024 00:00:00Z 45 201
3 03/05/2024 00:00:00Z NULL 56
4 04/05/2024 00:00:00Z 8 NULL

Codifica

Se esegui query sulla vista materializzata continua con SQL, non devi conoscere la modalità di codifica dei valori aggregati perché SQL espone i risultati come colonne con tipi.

Se leggi dalla visualizzazione utilizzando ReadRows, devi decodificare i dati aggregati nella richiesta di lettura. Per ulteriori informazioni sulle richieste ReadRows, consulta la sezione Letture.

I valori aggregati in una visualizzazione materializzata continua vengono archiviati utilizzando la codifica descritta nella tabella seguente, in base al tipo di output della colonna della definizione della visualizzazione.

Tipo Codifica
BOOL Valore di 1 byte, 1 = true, 0 = false
BYTES Nessuna codifica
INT64 (o INT, SMALLINT, INTEGER, BIGINT, TINYINT, BYTEINT) Big endian a 64 bit
FLOAT64 IEEE 754 a 64 bit, esclusi NaN e +/-inf
STRING UTF-8
TEMPO/TIMESTAMP Numero intero a 64 bit che rappresenta il numero di microsecondi dall'epoca Unix (in linea con GoogleSQL)
Per ulteriori informazioni, consulta la sezione Codifica nella documentazione di riferimento dell'API Data.

Passaggi successivi