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