Vektorsuche mit der spaltenbasierten Engine beschleunigen

Mit der spaltenbasierten Engine von AlloyDB for PostgreSQL können Sie Ihre Vektorsuchen beschleunigen, wenn Sie den Scalable Nearest Neighbors (ScaNN)- oder Hierarchical Navigable Small World (HNSW)-Index verwenden. Die spaltenbasierte Engine fungiert als leseoptimierter In‑Memory-Cache für diese Vektorindexe.

Wenn Sie Ihre Indexe in der spaltenbasierten Engine im Cache speichern, werden Abfragen direkt aus einer leseoptimierten In‑Memory-Darstellung des Index ausgeführt. Außerdem erhöht sich die Anzahl der Abfragen pro Sekunde, die Ihre Datenbank für Arbeitslasten mit Vektorsuchen verarbeiten kann.

Sie können HNSW nur mit der spaltenbasierten Engine für AlloyDB-Cluster verwenden, auf denen PostgreSQL 17 oder höher ausgeführt wird. Für ScaNN mit der spaltenbasierten Engine gilt diese Einschränkung nicht.

Hinweis

  • Setzen Sie die Datenbank-Flags google_columnar_engine.enabled und google_columnar_engine.enable_index_caching auf on, um die spaltenbasierte Engine und die Index-Caching-Funktion zu aktivieren.

    gcloud alloydb instances update INSTANCE_ID \
        --database-flags google_columnar_engine.enabled=on,google_columnar_engine.enable_index_caching=on \
        --region=REGION \
        --cluster=CLUSTER_ID \
        --project=PROJECT_ID

    Ersetzen Sie Folgendes:

    • INSTANCE_ID: die ID der Instanz, in der Sie die spaltenbasierte Engine aktivieren möchten.
    • REGION: die Region, in der sich Ihre Instanz befindet, z. B. us-central1.
    • CLUSTER_ID: die ID des Clusters, in dem sich Ihre Instanz befindet.
    • PROJECT_ID: die ID des Projekts, in dem sich Ihr Cluster befindet.

    Weitere Informationen zum Festlegen von Flags finden Sie unter Datenbank-Flags konfigurieren.

  • Erstellen Sie einen ScaNN-Index oder einen HNSW-Index in Ihrer Datenbank.

Index zur spaltenbasierten Engine hinzufügen

Nachdem Sie die spaltenbasierte Engine aktiviert haben, können Sie mit der SQL-Funktion google_columnar_engine_add_index() einen vorhandenen Index zum Cache hinzufügen.

So fügen Sie der spaltenbasierten Engine einen Index hinzu:

  1. Rufen Sie in der Google Cloud Console die Seite Cluster auf.

    Zu den Clustern

  2. Klicken Sie in der Spalte Ressourcenname auf den Namen des AlloyDB-Clusters, um die Seite Übersicht des Clusters aufzurufen.

  3. Klicken Sie im Navigationsbereich auf AlloyDB Studio.

  4. Melden Sie sich mit dem Namen Ihrer Datenbank, Ihrem Nutzernamen und Ihrem Passwort in AlloyDB Studio an.

  5. Geben Sie auf dem Tab Editor 1 die folgende Abfrage ein:

    SELECT google_columnar_engine_add_index('INDEX_NAME');
    

    Ersetzen Sie INDEX_NAME durch den Namen Ihres Vektorindex.

    1. Klicken Sie auf Ausführen.

Nachdem Sie der spaltenbasierten Engine einen Index hinzugefügt haben, werden alle Abfragen, die diesen Index verwenden, automatisch von der spaltenbasierten Engine beschleunigt. Sie können überprüfen, ob Ihre Vektorabfragen von der spaltenbasierten Engine beschleunigt werden, indem Sie den Plan EXPLAIN (ANALYZE, COLUMNAR_ENGINE) für Ihre Abfrage verwenden.

Cache-Nutzung überprüfen

Sie können überprüfen, ob Ihre Vektorabfragen von der spaltenbasierten Engine beschleunigt werden, indem Sie den Plan EXPLAIN (ANALYZE, COLUMNAR_ENGINE) für Ihre Abfrage verwenden.

Beispiel für einen ScaNN-Ausführungsplan

Das folgende Beispiel zeigt einen Ausführungsplan für eine Abfrage, die einen ScaNN-Index verwendet, der der spaltenbasierten Engine hinzugefügt wurde:

EXPLAIN (ANALYZE TRUE, SCANN TRUE, COSTS FALSE, TIMING FALSE, SUMMARY FALSE, VERBOSE FALSE, COLUMNAR_ENGINE TRUE)
SELECT * FROM t ORDER BY val <=> '[0.5,0.5,0.5,0.5]' LIMIT 100;

--This contains details about ScaNN's usage from the columnar engine. Example:
------------------------------------------------------------------------------------------------------
 Index Scan using scann_idx on t t_1 (actual rows=100 loops=1)
      Order By: (val <=> '[0.5,0.5,0.5,0.5]'::vector)
      Limit: 100
      ScaNN Info: (... columnar engine nodes hit=6...)
      Columnar Engine ScaNN Info: (index found=true)
(5 rows)

Das Vorhandensein von columnar engine nodes hit und Columnar Engine ScaNN Info: (index found=true) in der Ausgabe bestätigt, dass die spaltenbasierte Engine für die Abfrage verwendet wird.

Beispiel für einen HNSW-Ausführungsplan

Der Ausführungsplan enthält den Abschnitt Columnar Engine HNSW Info für den jeweiligen Index mit Messwerten wie dem Verhältnis der Elemente, die aus der spaltenbasierten Engine (elements_from_ce) und von der Festplatte (elements_from_disk) abgerufen wurden.

Das folgende Beispiel zeigt einen Ausführungsplan für eine Abfrage, die einen HNSW-Index verwendet, der der spaltenbasierten Engine hinzugefügt wurde:

EXPLAIN (ANALYZE, COLUMNAR_ENGINE) SELECT * FROM documents ORDER BY embedding <=> '[0.1, 0.2, 0.3, 0.4, 0.5]'::vector LIMIT 5;

--This contains details about HNSW's usage from the columnar engine. Example:
------------------------------------------------------------------------------------------------------
 Limit (actual rows=5 loops=1)
   ->  Index Scan using hnsw_idx on documents (actual rows=5 loops=1)
         Order By: (embedding '[0.1, 0.2, 0.3, 0.4, 0.5]'::vector)
         Columnar Engine HNSW Info: (index found=true elements_from_ce=385 elements_from_disk=0)
         Columnar Check: table is not in the columnar store
(5 rows)

Die Antwort zeigt, dass der Index von der spaltenbasierten Engine beschleunigt wird, da alle Elemente aus der spaltenbasierten Engine abgerufen wurden (elements_from_ce=385) und keine von der Festplatte (elements_from_disk=0).

Wenn Datenänderungen wie INSERT-, UPDATE- oder DELETE-Anweisungen Cacheeinträge ungültig machen, verwendet die spaltenbasierte Engine einen Hybridansatz, um Genauigkeit und Leistung aufrechtzuerhalten. Gültige, im Cache gespeicherte Vektoren werden direkt aus dem Arbeitsspeicher gelesen und nur die geänderten oder neuen Vektoren von der Festplatte abgerufen.

Wenn Sie eine große Menge an Daten ändern, kann es vorübergehend zu einer Zunahme von „elements_from_disk“ und einem Leistungsabfall kommen, bis der Cache aktualisiert wird.

Index im Cache verwalten

So verwalten Sie den Lebenszyklus Ihrer Indexe im Cache:

  1. Rufen Sie in der Google Cloud Console die Seite Cluster auf.

    Zu den Clustern

  2. Klicken Sie in der Spalte Ressourcenname auf den Namen des AlloyDB-Clusters, um die Seite Übersicht des Clusters aufzurufen.

  3. Klicken Sie im Navigationsbereich auf AlloyDB Studio.

  4. Melden Sie sich mit dem Namen Ihrer Datenbank, Ihrem Nutzernamen und Ihrem Passwort in AlloyDB Studio an.

  5. Geben Sie auf dem Tab Editor 1 den SQL-Befehl für die ausgewählte Aufgabe ein:

    • Führen Sie den folgenden Befehl aus, um den Cache manuell zu aktualisieren:

      SELECT google_columnar_engine_refresh_index('INDEX_NAME');
      
    • Führen Sie den folgenden Befehl aus, um den Indexstatus zu überprüfen:

      SELECT google_columnar_engine_verify('INDEX_NAME');
      
    • Führen Sie den folgenden Befehl aus, um den Index aus dem Cache zu entfernen:

      SELECT google_columnar_engine_drop_index('INDEX_NAME');
      
    • Führen Sie den folgenden Befehl aus, um aktive Indexe aufzurufen:

      SELECT * FROM g_columnar_indexes;
      
    • Führen Sie den folgenden Befehl aus, um partitionierte Indexe aufzurufen:

      SELECT * FROM g_columnar_index_partitions;
      

    Ersetzen Sie INDEX_NAME durch den Namen Ihres Index.

  6. Klicken Sie auf Ausführen.

Beschränkungen

Beim Aktualisieren von HNSW-Indexen, die von der spaltenbasierten Engine beschleunigt werden, kann vorübergehend bis zu zweimal die Indexgröße an Arbeitsspeicher belegt werden.

Nächste Schritte