Wenn Sie Ihre Indexe in der spaltenorientierten Engine im Cache speichern, werden Abfragen direkt aus einer leseoptimierten In-Memory-Darstellung des Index bedient. Dadurch erhöht sich die Anzahl der Abfragen pro Sekunde, die Ihre Datenbank für Arbeitslasten für die Vektorsuche verarbeiten kann.
Sie können HNSW nur mit der spaltenbasierten Engine für AlloyDB Omni-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.enabledundgoogle_columnar_engine.enable_index_cachingaufon, um die spaltenbasierte Engine und die zugehörige Index-Caching-Funktion zu aktivieren.Ändern Sie das Manifest Ihres Datenbankclusters, um dem Abschnitt
primarySpecdas Attributparametershinzuzufügen:apiVersion: alloydbomni.dbadmin.goog/v1 kind: DBCluster metadata: name: CLUSTER_NAME spec: databaseVersion: "18.1.0" primarySpec: parameters: google_columnar_engine.enabled: "on" google_columnar_engine.enable_index_caching: "on"Ersetzen Sie
CLUSTER_NAMEdurch den Namen Ihres Datenbankclusters. Das ist derselbe Datenbankclustername, den Sie beim Erstellen des Clusters angegeben haben.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 dem Cache einen vorhandenen Index mit der SQL-Funktion google_columnar_engine_add_index() hinzufügen.
Führen Sie die folgende Abfrage aus, um der spaltenbasierten Engine einen Index hinzuzufügen:
SELECT google_columnar_engine_add_index('INDEX_NAME');
Ersetzen Sie INDEX_NAME durch den Namen Ihres Vektorindex.
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 prüfen, ob Ihre Vektorabfragen durch die spaltenbasierte Engine beschleunigt werden, indem Sie den EXPLAIN (ANALYZE, COLUMNAR_ENGINE)-Plan für Ihre Abfrage verwenden.
Cache-Nutzung prüfen
Wenn Sie prüfen möchten, ob Ihre Vektorabfragen durch die spaltenbasierte Engine beschleunigt werden, können Sie den EXPLAIN (ANALYZE, COLUMNAR_ENGINE)-Plan für Ihre Abfrage verwenden.
Beispiel für einen ScaNN-Ausführungsplan
Das Folgende ist ein Beispiel für 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, in dem Messwerte wie das Verhältnis der Elemente angezeigt werden, die aus der spaltenbasierten Engine (elements_from_ce) und von der Festplatte (elements_from_disk) abgerufen wurden.
Das Folgende ist ein Beispiel für einen Ausführungsplan für eine Abfrage, die einen HNSW-Index verwendet, der der spaltenorientierten 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 (elements_from_ce=385) und keine von der Festplatte (elements_from_disk=0) abgerufen wurden.
Wenn durch Datenänderungen wie INSERT-, UPDATE- oder DELETE-Anweisungen Cache-Einträge ungültig werden, verwendet die spaltenbasierte Engine einen hybriden Ansatz, 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 werden von der Festplatte abgerufen.
Wenn Sie eine große Menge an Daten ändern, kann es vorübergehend zu einem Anstieg von „elements_from_disk“ und einem Leistungsabfall kommen, bis der Cache aktualisiert wird.
Zwischengespeicherten Index verwalten
Führen Sie den SQL-Befehl für die ausgewählte Aufgabe aus, um den Lebenszyklus Ihrer im Cache gespeicherten Indexe zu verwalten:
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 prü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.
Beschränkungen
Beim Aktualisieren von HNSW-Indexen, die durch die spaltenbasierte Engine beschleunigt werden, kann vorübergehend bis zum Doppelten der Indexgröße an Arbeitsspeicher belegt werden.
Nächste Schritte
- Indexe erstellen und Vektoren mit ScaNN abfragen
- Übersicht über die spaltenbasierte Engine
- Spalten manuell verwalten
- Vektorsuche ausführen