Query 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 una sintassi SQL limitata. 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 dell'indice secondario asincrono, una clausola ORDER BY, ma non entrambe.
  • Devono essere utilizzate 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 nel seguente esempio:

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
  • SELECT *
  • Clausola OVER per creare un'aggregazione di finestre
  • STRUCT

Inoltre, non puoi nidificare le clausole GROUP BY o ORDER BY né creare colonne della mappa. Per ulteriori limitazioni, vedi Limitazioni.

Evitare le righe escluse

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

  • Dalla riga vengono selezionati più di 1 MB 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 colonne apple e banana viene esclusa dalla vista materializzata continua.
  • Dalla riga viene generato più di 1 MiB di dati. Ciò può verificarsi quando utilizzi query come SELECT REPEAT(apple, 1000) o costanti di grandi dimensioni.
  • Viene generato un output di dati più di 10 volte superiore a quelli selezionati.
  • La query non corrisponde ai tuoi dati. Ciò include il tentativo di dividere per zero, l'overflow di numeri interi o l'attesa di un formato della 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, mentre 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.

Ecco un esempio di una 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 un _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 specificare facoltativamente una colonna _key quando definisci la vista materializzata continua. (Questo è diverso dalla colonna _key che ottieni quando esegui una query SQL su una tabella Bigtable.) Se specifichi un _key, si applicano le seguenti regole:

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

Specificare un _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 un _key definito potrebbe dover decodificare il _key in modo esplicito anziché restituire solo colonne di chiavi strutturate.

Chiavi di riga definite dalla clausola GROUP BY o ORDER BY

Se non specifichi un _key, le colonne non aggregate nell'elenco SELECT diventano la chiave di riga nella visualizzazione. Puoi assegnare alle colonne chiave 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 vengono scritte le colonne 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 visualizzazione. 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 memorizza i dati con le chiavi di riga ordinate per a ASC, poi per b ASC e infine per c ASC.

Il filtro SQL deve eliminare potenziali 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 degli utenti, prova a eseguire la query SQL al di fuori di una vista materializzata continua.

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 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, il sum_foo della riga di output è un valore non NULL.
  • Se un determinato baz ha almeno un bar, il 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 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 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 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 al millisecondo). Bigtable non supporta i timestamp delle celle precedenti all'epoca di Unix (1970-01-01T00:00:00Z).

Considera il seguente esempio, che esegue il ricampionamento dei 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 corrispondente al giorno troncato.

Se esegui una query sulla visualizzazione con SELECT *, il risultato sarà 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 query sulla vista materializzata continua con SQL, non devi sapere come vengono codificati i valori aggregati perché SQL espone i risultati come colonne tipizzate.

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 vista materializzata continua vengono archiviati utilizzando la codifica descritta nella tabella seguente, in base al tipo di output della colonna della 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) 64 bit big-endian
FLOAT64 IEEE 754 a 64 bit, escluso 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 la sezione Codifica nel riferimento dell'API Data.

Passaggi successivi