Asynchrone Abfragen für sekundäre Indexe
Dieses Dokument enthält Beispiele für gängige Abfragemuster zum Erstellen asynchroner sekundärer Indexe in Bigtable. In den Beispielen werden IDs und Werte verwendet, die denen in Beispieldaten ähneln. Sie können eine Testtabelle erstellen, um die Abfragen zu testen.
Bevor Sie diese Seite lesen, sollten Sie sich mit den Informationen unter Asynchronen sekundären Index erstellen und GoogleSQL für Bigtable vertraut machen.
Beispielabfragen
In den folgenden Beispielen wird gezeigt, wie asynchrone sekundäre Indexe mit verschiedenen GoogleSQL-Abfragen erstellt werden.
Invertierten Index basierend auf einem Spaltenqualifizierer und Werten erstellen
Mit der folgenden Abfrage wird ein invertierter Index erstellt, indem alle Schlüssel/Wert-Paare aus einer Spaltenfamilie mit einem flexiblen Schema extrahiert werden. Dazu wird MAP_ENTRIES
verwendet, um ein Array mit allen Daten abzurufen, die in der Spaltenfamilie stats_summary
gespeichert sind. Anschließend wird UNNEST
verwendet, um jedes Schlüssel/Wert-Paar in eine separate Zeile zu transformieren. Der resultierende Index ermöglicht schnelle Suchvorgänge basierend auf stat_description
und stat_value
. Wenn Sie der Quelltabelle neue Statistiktypen hinzufügen, werden diese automatisch in den asynchronen Index von Bigtable aufgenommen.
SELECT
stats.key as stat_description,
stats.value as stat_value,
_key as original_key,
cell_plan as cell_plan
FROM test_table
CROSS JOIN UNNEST(MAP_ENTRIES(stats_summary)) stats
ORDER BY stat_description, stat_value, original_key
Neuen Zeilenschlüssel auf Grundlage vorhandener Daten erstellen
Im folgenden Beispiel wird ein neuer Indexschlüssel, total_plan_capacity
, erstellt, indem die in der Spaltenfamilie cell_plan
gespeicherten Datentarife kategorisiert werden. In der Abfrage wird MAP_KEYS
verwendet, um alle Schlüssel in cell_plan
abzurufen, und ARRAY_INCLUDES_ANY
, um nach bestimmten Schlüssel für Datenpläne zu filtern. Mit einer CASE
-Anweisung wird dann die Logik zum Zuweisen einer total_plan_capacity
-Kategorie basierend auf dem Vorhandensein und den Werten dieser Datentarife definiert. Dies ermöglicht effiziente Suchvorgänge basierend auf der kombinierten Datentarifkapazität.
SELECT
CASE
WHEN
cell_plan['data_plan_01gb'] = "true"
AND (cell_plan['data_plan_05gb'] = "false" OR cell_plan['data_plan_05gb'] IS NULL)
AND (cell_plan['data_plan_10gb'] = "false" OR cell_plan['data_plan_10gb'] IS NULL)
THEN 'x-small'
WHEN
cell_plan['data_plan_01gb'] = "true"
AND (cell_plan['data_plan_05gb'] = "true")
AND (cell_plan['data_plan_10gb'] = "false" OR cell_plan['data_plan_10gb'] IS NULL)
THEN 'small'
WHEN
cell_plan['data_plan_01gb'] = "true"
AND (cell_plan['data_plan_05gb'] = "false" OR cell_plan['data_plan_05gb'] IS NULL)
AND (cell_plan['data_plan_10gb'] = "true")
THEN 'medium'
WHEN
(cell_plan['data_plan_01gb'] = "false" OR cell_plan['data_plan_01gb'] IS NULL)
AND (cell_plan['data_plan_05gb'] = "true")
AND (cell_plan['data_plan_10gb'] = "true")
THEN 'large'
WHEN
cell_plan['data_plan_01gb'] = "true"
AND (cell_plan['data_plan_05gb'] = "true")
AND (cell_plan['data_plan_10gb'] = "true")
THEN 'x-large'
END as total_plan_capacity,
_key as original_key,
stats_summary
FROM test_table
WHERE ARRAY_INCLUDES_ANY(MAP_KEYS(cell_plan), ["data_plan_01gb", "data_plan_05gb","data_plan_10gb"])
ORDER BY total_plan_capacity, original_key
Zeitreihenbasierten Index erstellen
In Bigtable werden jeder Zellenwert und der zugehörige Zeitstempel gespeichert. Mit dem Flag WITH_HISTORY=>TRUE
in der FROM
-Klausel können Sie alle Versionen von Daten und ihre Zeitstempel abrufen. Die Tabellenfunktion UNPACK
erweitert dann die Abfrageergebnisse, sodass jeder Zeitstempelwert in einer eigenen Zeile mit einer separaten Spalte _timestamp
angezeigt wird. So können Sie einen asynchronen sekundären Index erstellen, bei dem der neue Zeilenschlüssel auf diesen Zeitstempelwerten basiert. Das ermöglicht schnelle Suchvorgänge, die auf Zeiträumen basieren.
SELECT
_timestamp as stats_timestamp,
_key as original_key,
stats_summary
FROM UNPACK((
select
_key,
stats_summary
FROM
test_table (WITH_HISTORY=>TRUE)
))
ORDER BY stats_timestamp, original_key
Indexeintrag für Elemente und Werte in einer JSON-Zelle erstellen
Bigtable wird häufig als Schlüssel/Wert-Speicher für umfangreiche Arbeitslasten verwendet, einschließlich Daten in Formaten wie JSON. Im folgenden Beispiel wird gezeigt, wie Sie einen asynchronen sekundären Index für schnelle Suchvorgänge für Daten erstellen, die in JSON gespeichert sind. In der Abfrage wird JSON_EXTRACT
verwendet, um store_id
aus einem JSON-String in der Spaltenfamilie transaction_information
in einer Tabelle mit dem Namen sales
zu extrahieren. Dieser Index ermöglicht den schnellen Abruf von Verkaufstransaktionen nach bestimmten Store-IDs.
SELECT
JSON_EXTRACT(transaction_information["json"], "$.store_id") as store_id,
_key as original_key,
transaction_information
from sales
ORDER BY store_id, original_key;
Nächste Schritte
- Kontinuierliche Abfragen materialisierter Ansichten
- Kontinuierliche materialisierte Ansichten erstellen und verwalten