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