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
Le query SQL che utilizzano funzioni non deterministiche sono semanticamente diverse dalle altre query vista materializzata continue. Per saperne di più, consulta la sezione Query non deterministiche di questo documento.
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 avere una clausola
GROUP BYo, per le query sugli 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 la maggior parte delle altre funzioni non deterministiche, con eccezioni.DATE,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 la sezione
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, il superamento del limite massimo per gli interi o l'utilizzo di un formato di chiave di riga non utilizzato in ogni chiave di riga.
Le righe escluse aumentano la metrica degli errori utente quando vengono elaborate per la prima volta. Per saperne di più sulle metriche che possono aiutarti a monitorare le viste materializzate continue, consulta la sezione 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 saperne di più, consulta la sezione 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 e infine 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 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 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 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 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 di 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 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 |
Query non deterministiche
Le viste materializzate continue supportano le seguenti funzioni SQL non deterministiche.
La funzione dell'attributo del cluster
La funzione CLUSTER_ATTRIBUTE() consente di accedere in modo programmatico ai metadati del cluster Bigtable che esegue la query della vista materializzata continua. L'attributo cluster_id restituisce l'identificatore stringa del cluster che elabora la vista.
Isolare una vista in un singolo cluster
Per isolare il calcolo e l'archiviazione della vista materializzata continua in un singolo
cluster, ad esempio un cluster di analisi o di reporting dedicato, confronta
CLUSTER_ATTRIBUTE('cluster_id') con un valore letterale stringa costante che contiene l'
identificatore del cluster:
SELECT
metrics['sensor_id'] AS sensor_id,
COUNT(1) AS reading_count
FROM `TABLE_ID`
WHERE CLUSTER_ATTRIBUTE('cluster_id') = 'CLUSTER_ID'
GROUP BY 1
Sostituisci quanto segue:
TABLE_ID: l'identificatore univoco della tabella Bigtable.CLUSTER_ID: l'identificatore del cluster in cui vuoi materializzare la vista.
Questa query si comporta nel seguente modo nell'istanza:
- Cluster designato: nel cluster che corrisponde a
CLUSTER_ID, la condizioneWHERErestituiscetrue. Bigtable aggrega tutti i dati della tabella di origine, indipendentemente dal cluster che li ha inseriti o replicati, e li materializza nella copia della vista del cluster. - Altri cluster: in tutti gli altri cluster dell'istanza,
CLUSTER_ATTRIBUTE('cluster_id')restituisce i rispettivi ID cluster, rendendo laWHEREcondizionefalse. Questi cluster non calcolano né archiviano righe per la vista materializzata continua, il che consente di risparmiare risorse di calcolo e di archiviazione.
Filtrare i dati in base all'origine del cluster
Se la tua applicazione scrive i metadati del cluster nelle righe della tabella di origine, ad esempio in una colonna denominata origin_cluster, puoi confrontare il cluster di origine della riga con il cluster di elaborazione:
SELECT
metrics['sensor_id'] AS sensor_id,
COUNT(1) AS reading_count
FROM `TABLE_ID`
WHERE metrics['origin_cluster'] = CLUSTER_ATTRIBUTE('cluster_id')
GROUP BY 1
In questa query, metrics['origin_cluster'] è una proprietà dei dati archiviati
nella riga, mentre CLUSTER_ATTRIBUTE('cluster_id') è una proprietà del
cluster che elabora la vista. La replica di ogni cluster della vista materializzata continua aggrega solo le righe in cui l'origin_cluster archiviato corrisponde all'ID del cluster.
Se alcune righe potrebbero non avere un cluster di origine specificato, puoi utilizzare IF_NULL per assegnare un cluster di riserva:
SELECT
metrics['sensor_id'] AS sensor_id,
COUNT(1) AS reading_count
FROM `TABLE_ID`
WHERE IF_NULL(metrics['origin_cluster'], 'DEFAULT_CLUSTER_ID') = CLUSTER_ATTRIBUTE('cluster_id')
GROUP BY 1
Caratteristiche della query
Le query che utilizzano CLUSTER_ATTRIBUTE hanno le seguenti caratteristiche:
- Poiché
sensor_idè nella clausolaGROUP BY, diventa parte della chiave di riga nella vista materializzata continua. - Per utilizzare questa funzione non deterministica, devi impostare il flag
ignore_warningssutruequando crei la vista. Per saperne di più, consulta la sezione Creare una vista materializzata continua.
Quando esegui una query sulla vista con SELECT *, il risultato sarà simile al seguente:
| sensor_id | reading_count |
|---|---|
| sensor-1234 | 25 |
| sensor-5678 | 68 |
Limitazioni
L'utilizzo della funzione non deterministica CLUSTER_ATTRIBUTE introduce requisiti di routing rigorosi:
- Il routing multi-cluster non è supportato: poiché l'output della funzione dipende dal cluster fisico che esegue la query, il routing multi-cluster produrrebbe risultati non deterministici.
- Utilizza il routing a cluster singolo: quando esegui una query su una vista materializzata continua
che utilizza
CLUSTER_ATTRIBUTE, utilizza un profilo dell'applicazione configurato per il routing a cluster singolo. - Esegui il routing al cluster designato: se isoli una vista in un cluster specifico, ad esempio
WHERE CLUSTER_ATTRIBUTE('cluster_id') = 'my-reporting-cluster', indirizza il profilo dell'applicazione direttamente a quel cluster. L'esecuzione di query su un altro cluster restituisce risultati vuoti perché la vista non viene compilata su altri cluster.
Codifica
Se esegui una query sulla vista materializzata continua con SQL, non devi sapere come vengono codificati i valori aggregati perché SQL espone i risultati come colonne con tipo.
Se leggi dalla vista utilizzando ReadRows, devi decodificare i dati aggregati nella richiesta di lettura. Per saperne di più 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 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 | Intero a 64 bit che rappresenta il numero di microsecondi dall'epoca di Unix (coerente con GoogleSQL) |
Passaggi successivi
- Creare e gestire viste materializzate continue
- Documentazione di riferimento di GoogleSQL per Bigtable