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 clausolaORDER 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 deterministicheDATE
,DATETIME
come colonne di output (utilizzaTIMESTAMP
o memorizza una stringa).DESC
ordinamento nell'outputDISTINCT
, come inSUM(*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 colonneapple
ebanana
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 tipoBYTES
.
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 ordinebaz ASC
. - Se un determinato
baz
ha almeno unfoo
, ilsum_foo
della riga di output è un valore non NULL. - Se un determinato
baz
ha almeno unbar
, ilsum_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) |
Passaggi successivi
- Creare e gestire viste materializzate continue
- Documentazione di riferimento di GoogleSQL per Bigtable