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 BYo, per le query degli indici secondari asincroni, una clausolaORDER 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:
COUNTSUMMINMAXHLL_COUNT.INITHLL_COUNT.MERGEHLL_COUNT.MERGE_PARTIALANY_VALUEBIT_ANDBIT_ORBIT_XORAVG
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
ARRAYARRAY_AGGARRAY_CONCAT_AGGCOUNT_IFCURRENT_TIMEe altre funzioni non deterministicheDATE,DATETIMEcome colonne di output (utilizzaTIMESTAMPo memorizza una stringa).- Ordinamento
DESCnell'output DISTINCTopzione, come inSUM(*DISTINCT* value))LIMIT/OFFSETSELECT *- Clausola
OVERper 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 nelleappleebananacolonne 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
_keye non puoi raggruppare per nient'altro, tranne (facoltativamente) per_timestamp. Per ulteriori informazioni, consulta Timestamp. - La colonna
_keydeve essere di tipoBYTES.
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 ordinebaz ASC. - Se un determinato
bazha almeno unfoo, allorasum_foodella riga di output è un valore non NULL. - Se un determinato
bazha almeno unbar, allorasum_bardella riga di output è un valore non NULL. - Se un determinato
baznon 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) |
Passaggi successivi
- Creare e gestire viste materializzate continue
- Documentazione di riferimento di GoogleSQL per Bigtable