Abfragen von kontinuierlichen materialisierten Ansichten
Wenn Sie eine kontinuierliche materialisierte Ansicht einer Bigtable-Tabelle erstellen möchten, führen Sie eine SQL-Abfrage aus, mit der die kontinuierliche materialisierte Ansicht definiert wird.
In diesem Dokument werden Konzepte und Muster beschrieben, die Ihnen bei der Vorbereitung Ihrer kontinuierlichen SQL-Abfrage für materialisierte Ansichten helfen. Bevor Sie dieses Dokument lesen, sollten Sie sich mit kontinuierlichen materialisierten Ansichten und GoogleSQL für Bigtable vertraut machen.
Kontinuierliche materialisierte Ansichten verwenden eine eingeschränkte SQL-Syntax. Das folgende Muster zeigt, wie eine SQL-Abfrage für eine kontinuierliche materialisierte Ansicht erstellt wird:
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
Wenn Sie eine SQL-Abfrage für eine kontinuierliche materialisierte Ansicht als globalen sekundären Index erstellen möchten, verwenden Sie die ORDER BY
-Klausel:
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
Abfragebeschränkungen
Für eine SQL-Abfrage, mit der eine kontinuierliche materialisierte Ansicht erstellt wird, gelten die folgenden Regeln:
- Muss eine
SELECT
-Anweisung sein. - Muss eine
GROUP BY
-Klausel oder für globale sekundäre Indexabfragen eineORDER BY
-Klausel enthalten, aber nicht beides. - Es dürfen nur unterstützte Aggregatfunktionen verwendet werden.
- Kann mehrere Aggregationen pro Gruppe haben.
Unterstützte Aggregationen
Sie können die folgenden Aggregationsfunktionen in einer SQL-Abfrage verwenden, die eine fortlaufende materialisierte Ansicht definiert:
COUNT
SUM
MIN
MAX
HLL_COUNT.INIT
HLL_COUNT.MERGE
HLL_COUNT.MERGE_PARTIAL
ANY_VALUE
BIT_AND
BIT_OR
BIT_XOR
AVG
Wenn Sie SELECT COUNT(*)
verwenden, müssen Sie einen Zeilenschlüssel definieren, wie im folgenden Beispiel:
SELECT
'*' AS _key,
COUNT(*) AS count
FROM
foo
GROUP BY
_key;
Nicht unterstützte SQL-Features
Die folgenden SQL-Funktionen können Sie nicht verwenden:
- Alle Funktionen, die von GoogleSQL for Bigtable nicht unterstützt werden
ARRAY
ARRAY_AGG
ARRAY_CONCAT_AGG
COUNT_IF
CURRENT_TIME
und andere nicht deterministische FunktionenDATE
,DATETIME
als Ausgabespalten (Verwenden SieTIMESTAMP
oder speichern Sie einen String.)DESC
-Sortierung in der AusgabeDISTINCT
-Option, z. B.SUM(*DISTINCT* value)
LIMIT/OFFSET
SELECT *
OVER
-Klausel zum Erstellen einer Windowing-AggregationSTRUCT
Außerdem können Sie keine GROUP BY
- oder ORDER BY
-Klauseln verschachteln oder Karten-Spalten erstellen. Weitere Einschränkungen finden Sie unter Einschränkungen.
Ausgeschlossene Zeilen vermeiden
Eingabezeilen werden unter den folgenden Umständen aus einer kontinuierlichen materialisierten Ansicht ausgeschlossen:
- Es werden mehr als 1 MiB Daten aus der Zeile ausgewählt. Wenn Ihre Abfrage beispielsweise
SELECT apple AS apples , SUM(banana) AS sum_bananas FROM my_table GROUP BY apples
lautet, wird jede Zeile, die mehr als 1 MiB Daten in den Spaltenapple
undbanana
enthält, aus der kontinuierlichen materialisierten Ansicht ausgeschlossen. - Aus der Zeile werden mehr als 1 MiB Daten ausgegeben. Dies kann auftreten, wenn Sie Abfragen wie
SELECT REPEAT(apple, 1000)
oder große Konstanten verwenden. - Es werden mehr als zehnmal so viele Daten ausgegeben, als ausgewählt wurden.
- Die Abfrage stimmt nicht mit Ihren Daten überein. Dazu gehören Versuche, durch Null zu teilen, Ganzzahlüberläufe oder die Erwartung eines Zeilenschlüsselformats, das nicht in jedem Zeilenschlüssel verwendet wird.
Ausgeschlossene Zeilen erhöhen den Messwert für Nutzerfehler, wenn sie zum ersten Mal verarbeitet werden. Weitere Informationen zu Messwerten, mit denen Sie Ihre kontinuierlichen materialisierten Ansichten überwachen können, finden Sie unter Messwerte.
Abfragedetails
In diesem Abschnitt wird eine kontinuierliche materialisierte Ansichtsabfrage beschrieben und es wird gezeigt, wie die Ergebnisse aussehen können, wenn die Ansicht abgefragt wird. Die Daten in der Quelltabelle sind die Eingabe und die Ergebnisdaten in der kontinuierlichen materialisierten Ansicht sind die Ausgabe. Ausgabedaten sind entweder aggregiert oder nicht aggregiert (im definierten Schlüssel).
SELECT-Anweisung
Mit der SELECT-Anweisung werden die Spalten und Aggregationen konfiguriert, die in der kontinuierlichen materialisierten Ansicht verwendet werden. Für die Anweisung muss entweder eine GROUP BY
-Klausel verwendet werden, um Zeilen zu aggregieren, oder eine ORDER BY
-Klausel, um einen globalen sekundären Index zu erstellen.
SELECT *
wird nicht unterstützt, SELECT COUNT(*)
jedoch schon.
Wie bei einer typischen SELECT
-Anweisung können Sie mehrere Aggregationen pro gruppiertem Datensatz haben. Die nicht gruppierten Spalten müssen ein Aggregationsergebnis sein.
Hier ist ein Beispiel für eine Standard-GROUP BY
-Aggregationsabfrage in SQL:
SELECT
myfamily["node"] AS node,
myfamily["type"] AS type,
COUNT(clicks) AS clicks_per_key
FROM
mytable
GROUP BY
node,
type
Zeilenschlüssel und nicht aggregierte Daten
Sie können _key
als Zeilenschlüssel für eine fortlaufend materialisierte Ansicht angeben. Andernfalls bilden die Spalten in der GROUP BY
-Klausel den Schlüssel in der Ansicht.
Zeilenschlüssel, die durch eine _key
-Spalte definiert werden
Sie können optional eine _key
-Spalte angeben, wenn Sie Ihre kontinuierliche materialisierte Ansicht definieren. Dies unterscheidet sich von der Spalte _key
, die Sie erhalten, wenn Sie eine SQL-Abfrage für eine Bigtable-Tabelle ausführen. Wenn Sie eine _key
angeben, gelten die folgenden Regeln:
- Sie müssen nach
_key
gruppieren. Eine andere Gruppierung ist nur optional nach_timestamp
möglich. Weitere Informationen finden Sie unter Zeitstempel. - Die Spalte
_key
muss vom TypBYTES
sein.
Die Angabe von _key
ist nützlich, wenn Sie die Ansicht mit ReadRows
anstatt mit SQL lesen möchten, da Sie so das Zeilenschlüsselformat steuern können. Andererseits muss bei einer SQL-Abfrage für eine Ansicht mit einem definierten _key
das _key
möglicherweise explizit decodiert werden, anstatt nur strukturierte Schlüsselspalten zurückzugeben.
Zeilenschlüssel, die durch die GROUP BY
- oder ORDER BY
-Klausel definiert werden
Wenn Sie kein _key
angeben, werden die nicht aggregierten Spalten in Ihrer SELECT
-Liste zum Zeilenschlüssel in der Ansicht. Sie können den Schlüsselspalten beliebige Namen zuweisen, die den SQL-Konventionen entsprechen. Verwenden Sie diesen Ansatz, wenn Sie die Ansicht mit SQL abfragen möchten und nicht mit einer ReadRows
-Anfrage.
Nicht aggregierte Ausgabespalten in der SELECT
-Liste müssen in der GROUP
BY
-Klausel enthalten sein. Die Reihenfolge, in der Spalten in der GROUP BY
-Klausel geschrieben werden, ist die Reihenfolge, in der die Daten im Zeilenschlüssel der kontinuierlichen materialisierten Ansicht gespeichert werden. Beispiel: GROUP BY a, b, c
ist implizit ORDER BY a ASC, b ASC, c
ASC
.
Wenn Sie zum Erstellen eines globalen sekundären Index eine ORDER BY
-Klausel anstelle einer GROUP BY
-Klausel verwenden, werden die Spalten in Ihrer SELECT
-Liste, die Teil der ORDER BY
-Klausel sind, zum Zeilenschlüssel in der Ansicht. Die Reihenfolge, in der Spalten in der ORDER BY
-Klausel geschrieben werden, ist die Reihenfolge, in der die Daten im Zeilenschlüssel der kontinuierlichen materialisierten Ansicht gespeichert werden. Beispiel: Mit ORDER BY a, b, c
werden die Daten mit Zeilenschlüsseln gespeichert, die zuerst nach a ASC
, dann nach b ASC
und dann nach c ASC
sortiert sind.
Ihr SQL-Filter muss potenzielle NULL
- oder andere ungültige Werte eliminieren, die Fehler verursachen können. Eine ungültige Zeile, z. B. eine mit einer NULL
-Schlüsselspalte, wird aus den Ergebnissen entfernt und im Messwert materialized_view/user_errors
berücksichtigt. Wenn Sie Nutzerfehler beheben möchten, führen Sie die SQL-Abfrage außerhalb einer kontinuierlichen materialisierten Ansicht aus.
Aggregierte Daten
Mit den aggregierten Spalten in der Abfrage werden die Berechnungen definiert, mit denen die Daten in der fortlaufenden materialisierten Ansicht generiert werden.
Der Alias für eine aggregierte Spalte wird in der kontinuierlichen materialisierten Ansicht als Spaltenqualifizierer behandelt.
Dazu ein Beispiel:
SELECT
fam["baz"] AS baz,
SUM(fam["foo"]) AS sum_foo,
SUM(fam["bar"]) AS sum_bar
FROM
TABLE
GROUP BY
baz;
Die Abfrageausgabe hat die folgenden Merkmale:
- Die Ausgabe für jedes
baz
befindet sich in einer separaten Zeile in der Reihenfolge vonbaz ASC
. - Wenn ein bestimmtes
baz
mindestens einfoo
hat, istsum_foo
in der Ausgaberow ein Wert, der nicht NULL ist. - Wenn ein bestimmtes
baz
mindestens einbar
hat, istsum_bar
in der Ausgaberow ein Wert, der nicht NULL ist. - Wenn ein bestimmtes
baz
keinen Wert für eine der beiden Spalten hat, wird es aus den Ergebnissen ausgeschlossen.
Wenn Sie die Ansicht dann mit SELECT *
abfragen, sieht das Ergebnis in etwa so aus:
baz | sum_foo | sum_bar |
---|---|---|
baz1 | sum_foo1 | sum_bar1 |
baz2 | sum_foo2 | sum_bar2 |
Zeitstempel
Der Standardzeitstempel für eine Ausgabezelle in einer kontinuierlichen materialisierten Ansicht ist 0 (1970-01-01 00:00:00Z
). Das ist sichtbar, wenn Sie die Ansicht mit ReadRows
lesen, nicht aber, wenn Sie sie mit SQL abfragen.
Wenn Sie einen anderen Zeitstempel in der Ausgabe verwenden möchten, können Sie der SELECT
-Liste der Abfrage eine Spalte vom Typ TIMESTAMP
hinzufügen und sie _timestamp
nennen.
Wenn Sie die kontinuierliche materialisierte Ansicht mit ReadRows
abfragen, wird _timestamp
zum Zeitstempel für die anderen Zellen in der Zeile.
Ein Zeitstempel darf nicht NULL
sein, muss größer oder gleich null und ein Vielfaches von 1.000 sein (Millisekundengenauigkeit). Bigtable unterstützt keine Zellzeitstempel, die vor der Unix-Epoche (1970-01-01T00:00:00Z) liegen.
Im folgenden Beispiel werden aggregierte Daten nach Tag neu berechnet. Die Abfrage verwendet die Funktion 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
Wenn für ein bestimmtes SUM
für einen bestimmten Tag eine nicht leere Eingabe vorhanden ist, enthält die Ausgaberow einen aggregierten Wert mit einem Zeitstempel, der dem gekürzten Tag entspricht.
Wenn Sie die Ansicht mit SELECT *
abfragen, sieht das Ergebnis in etwa so aus:
_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 |
Codierung
Wenn Sie Ihre kontinuierliche materialisierte Ansicht mit SQL abfragen, müssen Sie nicht wissen, wie aggregierte Werte codiert werden, da die Ergebnisse in SQL als typisierte Spalten dargestellt werden.
Wenn Sie mit ReadRows
aus der Ansicht lesen, müssen Sie die aggregierten Daten in Ihrer Leseanfrage decodieren. Weitere Informationen zu ReadRows
-Anfragen finden Sie unter Lesevorgänge.
Aggregierte Werte in einer kontinuierlichen materialisierten Ansicht werden mit der in der folgenden Tabelle beschriebenen Codierung gespeichert, basierend auf dem Ausgabetyp der Spalte aus der Ansichtsdefinition.
Typ | Codierung |
---|---|
BOOL | 1-Byte-Wert, 1 = „true“, 0 = „false“ |
BYTES | Keine Codierung |
INT64 (oder INT, SMALLINT, INTEGER, BIGINT, TINYINT, BYTEINT) | 64‑Bit, Big-Endian |
FLOAT64 | 64-Bit-IEEE 754, ohne NaN und +/-inf |
STRING | UTF-8 |
TIME/TIMESTAMP | 64-Bit-Ganzzahl, die die Anzahl der Mikrosekunden seit der Unix-Epoche darstellt (entspricht GoogleSQL) |
Nächste Schritte
- Kontinuierliche materialisierte Ansichten erstellen und verwalten
- GoogleSQL for Bigtable-Referenzdokumentation