Query delle vista materializzata 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, devi avere familiarità con le viste materializzate continue e GoogleSQL per Bigtable.

Le viste materializzate continue utilizzano la sintassi SQL con limitazioni. Il seguente pattern mostra come creare una query SQL per una vista materializzata 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

Se vuoi creare una query SQL per una vista materializzata continua come indice secondario asincrono, utilizza la clausola 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

Limitazioni delle query

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

  • Deve essere un'istruzione SELECT.
  • Deve avere una clausola GROUP BY o, per le query degli indici secondari asincroni, una clausola ORDER BY, ma non entrambe.
  • Deve utilizzare solo le funzioni di aggregazione supportate.
  • Può avere più aggregazioni per gruppo.

Aggregazioni supportate

Puoi utilizzare le seguenti funzioni di aggregazione in una query SQL che definisce una vista 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).
  • Ordinamento DESC nell'output
  • DISTINCT opzione, come in SUM(*DISTINCT* value))
  • LIMIT/OFFSET
  • SELECT *
  • Clausola OVER per creare un'aggregazione di finestre
  • STRUCT

Inoltre, non puoi nidificare le clausole GROUP BY o ORDER BY né creare colonne di mappe. Per ulteriori limitazioni, consulta Limitazioni.

Evitare le righe escluse

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

  • Dalla riga viene selezionato 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 che contiene più di 1 MiB di dati nelle apple e banana colonne viene esclusa dalla vista materializzata continua.
  • Dalla riga viene generato più di 1 MiB di dati. Questo può verificarsi quando utilizzi query come SELECT REPEAT(apple, 1000) o costanti di grandi dimensioni.
  • Viene generato più di 10 volte il numero di dati selezionati.
  • La query non corrisponde ai dati. Ciò include il tentativo di dividere uno zero, un overflow di numeri interi o l'attesa di un formato di chiave di riga che non viene utilizzato in ogni chiave di riga.

Le righe escluse aumentano la metrica degli errori utente quando vengono elaborate per la prima volta. Per ulteriori informazioni sulle metriche che possono aiutarti a monitorare le viste materializzate continue, consulta Metriche.

Dettagli query

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

Istruzione SELECT

L'istruzione select configura le colonne e le aggregazioni utilizzate nella vista materializzata continua. L'istruzione deve utilizzare una clausola GROUP BY per aggregare le righe o una clausola ORDER BY per creare un indice secondario asincrono.

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

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

Di seguito è riportato 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

Puoi specificare una _key come chiave di riga per una vista materializzata continua. In caso contrario, le colonne nella clausola GROUP BY formano la chiave nella vista.

Chiavi di riga definite da una colonna _key

Puoi facoltativamente specificare una colonna _key quando definisci la vista materializzata continua. (Questa è diversa dalla _key colonna che ottieni quando esegui una query SQL su una tabella Bigtable.) Se specifichi una _key, si applicano le seguenti regole:

  • Devi raggruppare per _key e non puoi raggruppare per nient'altro, tranne (facoltativamente) per _timestamp. Per ulteriori informazioni, consulta Timestamp.
  • La colonna _key deve essere di tipo BYTES.

La specifica di una _key è utile se prevedi di leggere la vista con ReadRows anziché con SQL, perché ti consente di controllare il formato della chiave di riga. D'altra parte, una query SQL su una vista con una _key definita potrebbe dover decodificare la _key in modo esplicito anziché restituire solo le colonne delle chiavi strutturate.

Chiavi di riga definite dalla clausola GROUP BY o ORDER BY

Se non specifichi una _key, le colonne non aggregate nell'elenco SELECT diventano la chiave di riga nella vista. Puoi assegnare alle colonne delle chiavi qualsiasi nome supportato dalle convenzioni SQL. Utilizza questo approccio se prevedi di utilizzare SQL per eseguire query sulla vista anziché una richiesta ReadRows.

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

Se utilizzi una clausola ORDER BY anziché una clausola GROUP BY per creare un indice secondario asincrono, le colonne nell'elenco SELECT che fanno parte della clausola ORDER BY diventano la chiave di riga nella vista. L'ordine in cui le colonne vengono scritte nella clausola ORDER BY è l'ordine in cui i dati vengono archiviati nella chiave di riga della vista materializzata continua. Ad esempio, ORDER BY a, b, c archivia i dati con chiavi di riga ordinate per a ASC, poi b ASC, poi c ASC.

Il filtro SQL deve eliminare i potenziali valori NULL o altri valori non validi che possono causare errori. Una riga non valida, ad esempio una contenente una colonna chiave NULL, 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.

Dati aggregati

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

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

Considera il seguente esempio:

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 è in una riga separata in ordine baz ASC.
  • Se un determinato baz ha almeno un foo, allora sum_foo della riga di output è un valore non NULL.
  • Se un determinato baz ha almeno un bar, allora sum_bar della riga di output è un valore non NULL.
  • Se un determinato baz non ha un valore per nessuna delle due colonne, viene omesso dai risultati.

Se poi esegui una query sulla vista con SELECT *, il risultato è simile al seguente:

baz sum_foo sum_bar
baz1 sum_foo1 sum_bar1
baz2 sum_foo2 sum_bar2

Timestamp

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

Per utilizzare un timestamp diverso nell'output, puoi aggiungere una colonna di tipo TIMESTAMP all'elenco SELECT della query e chiamarla _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 Unix (1970-01-01T00:00:00Z).

Considera il seguente esempio, che ricampiona i dati aggregati per 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 che corrisponde al giorno troncato.

Se esegui una query sulla vista con SELECT *, il risultato è simile al seguente:

_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

Se esegui una query sulla vista materializzata continua con SQL, non devi essere a conoscenza di come vengono codificati i valori aggregati perché SQL espone i risultati come colonne tipizzate.

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

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

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
TIME/TIMESTAMP Numero intero a 64 bit che rappresenta il numero di microsecondi trascorsi dall'epoca Unix (coerente con GoogleSQL)
Per ulteriori informazioni, consulta Codifica nella documentazione di riferimento dell'API Data.

Passaggi successivi