Auf dieser Seite werden Best Practices für die Vektorindexierung beschrieben, mit denen Sie Ihre Vektorindexe optimieren und die Ergebnisse von ANN-Abfragen (Approximate Nearest Neighbor) verbessern können.
Optionen für die Vektorsuche optimieren
Wenn Sie keine Optionen für den Vektorindex angeben, versucht Spanner, automatisch optimierte Optionen auszuwählen. Erfahrene Nutzer, die die Optionen für den Vektorindex für ihre spezifische Arbeitslast optimieren möchten, können diese Werte festlegen und optimieren, indem sie einen neuen Vektorindex erstellen und index_option_list in der CREATE VECTOR INDEX-Anweisung festlegen. Die optimalen Werte für Ihre Vektorindexoptionen hängen von Ihrem Anwendungsfall, Ihrem Vektordatensatz und den Abfragevektoren ab. Möglicherweise müssen Sie die Werte iterativ anpassen, um die besten Werte für Ihre spezifische Arbeitslast zu finden.
Hier sind einige hilfreiche Richtlinien für die Auswahl geeigneter Werte:
tree_depth(Baumebene): Wenn die Tabelle, die Sie indexieren, weniger als 10 Millionen Zeilen hat, verwenden Sie fürtree_depthden Wert2. Andernfalls unterstützt eintree_depthvon3Tabellen mit bis zu etwa 10 Milliarden Zeilen. Wenn keine Angabe erfolgt, bestimmt Spanner den Wert fürtree_depthautomatisch.num_leaves: Wir empfehlen, pro Blatt 200 bis 1.000 Zeilen zu verwenden. Ein größerer Wert fürnum_leavesverlängert die Build-Dauer des Vektorindex, kann aber die Abfragekosten für einen bestimmten Ziel-Recall senken. Zu große Werte fürnum_leaveskönnen jedoch dazu führen, dass die Abfragekosten aufgrund des Overheads, der mit der Suche in vielen sehr kleinen Blattclustern verbunden ist, wieder steigen. Wenn nichts angegeben ist, ermittelt Spanner automatisch den Wert fürnum_leaves.num_branches: Diese Option gilt nur, wenntree_depth= 3 ist. Wir empfehlen, 50 bis 500 Blätter pro Zweig zu verwenden.num_branchessollte kleiner alsnum_leavessein. Ein größerer Wert fürnum_branchesverlängert die Build-Zeit für den Vektorindex, kann aber die Abfragekosten für einen bestimmten Ziel-Recall senken. Zu große Werte fürnum_brancheskönnen jedoch dazu führen, dass die Abfragekosten aufgrund des Overheads, der mit der Suche in vielen sehr kleinen Blattclustern verbunden ist, wieder steigen. Wenn nichts angegeben ist, ermittelt Spanner automatisch den Wert fürnum_branches.num_leaves_to_search: Mit dieser Option wird angegeben, wie viele Blattknoten des Index durchsucht werden. Durch Erhöhen vonnum_leaves_to_searchwird der Recall verbessert, aber auch die Latenz und die Kosten steigen. Wir empfehlen, fürnum_leaves_to_searcheine Zahl zu verwenden, die 1% der Gesamtzahl der Blätter ist, die in derCREATE VECTOR INDEX-Anweisung definiert sind. Wenn Sie eine Filterklausel verwenden, erhöhen Sie diesen Wert, um die Suche auszuweiten.
Wenn ein akzeptabler Recall erreicht wird, die Kosten für Abfragen jedoch zu hoch sind, was zu einer niedrigen maximalen QPS führt, versuchen Sie, num_leaves zu erhöhen. Gehen Sie dazu so vor:
- Setzen Sie
num_leavesauf ein Vielfacheskdes ursprünglichen Werts (z. B.2 * (table_row_count / 1000)). - Legen Sie
num_leaves_to_searchals das k-fache des ursprünglichen Werts fest. - Experimentieren Sie mit einer Reduzierung von
num_leaves_to_search, um Kosten und Anzahl der Abfragen pro Sekunde zu verbessern und gleichzeitig den Recall beizubehalten.
Werte für die Option „Vektorsuche“ festlegen
Wenn Sie die Parameter tree_depth, num_leaves und num_branches ermitteln möchten, die Spanner für den Vektorindex verwendet, fragen Sie die Ansicht INFORMATION_SCHEMA.INDEX_OPTIONS ab. Die Parameterwerte können sich geringfügig von den Werten unterscheiden, die Sie bei der Indexerstellung explizit angegeben haben, da Spanner sie manchmal an Ihre Daten anpasst.
Wenn Sie diese Parameter nicht angegeben haben, werden in der Ansicht INFORMATION_SCHEMA.INDEX_OPTIONS die von Spanner ausgewählten Werte angezeigt.
Führen Sie diese Abfrage aus, um die Parameterwerte aufzurufen:
SELECT
opt.option_name,
opt.option_type,
opt.option_value
FROM
INFORMATION_SCHEMA.INDEX_OPTIONS AS opt
WHERE
opt.index_name = @vector_index_name;
Die Abfrage gibt Zeilen zurück, die option_name enthalten: system_optimized_tree_depth, system_optimized_num_leaves und system_optimized_num_branches. Diese spiegeln die Parameter wider, die vom Index verwendet werden.
Recall verbessern
Um den Recall zu verbessern, können Sie den num_leaves_to_search-Wert anpassen oder den Vektorindex neu erstellen.
Erhöhen Sie den Wert von num_leaves_to_search.
Wenn der Wert von num_leaves_to_search zu klein ist, kann es schwieriger sein, die nächsten Nachbarn für einige Anfragevektoren zu finden. Wenn Sie einen neuen Vektorindex mit einem erhöhten num_leaves_to_search-Wert erstellen, kann dies die Erinnerung verbessern, da mehr Blätter durchsucht werden. Die letzten Anfragen enthalten möglicherweise mehr dieser anspruchsvollen Vektoren.
Vektorindex neu erstellen
Die Baumstruktur des Vektorindex wird zum Zeitpunkt der Erstellung für das Dataset optimiert und ist danach statisch. Wenn nach der Erstellung des ursprünglichen Vektorindex deutlich unterschiedliche Vektoren hinzugefügt werden, ist die Baumstruktur möglicherweise suboptimal, was zu einem schlechteren Recall führt.
Wählen Sie eine der folgenden Optionen aus, um Ihren Vektorindex ohne Ausfallzeiten zu aktualisieren:
Option 1: In-place-Neuindexierung mit denselben Optionen (mit DDL)
Wenn Sie einen In-Place-Neuindexierung Ihres Vektorindex mit denselben Indexoptionen durchführen möchten, können Sie je nach Datenbankdialekt die folgende DDL-Anweisung ausgeben. Die Neuindexierung erfolgt im Hintergrund und ermöglicht es, Lese- und Schreibvorgänge für den Index fortzusetzen.
GoogleSQL
ALTER VECTOR INDEX IncidentVectorIndex REBUILD;PostgreSQL
REINDEX INDEX CONCURRENTLY incidentvectorindex;Option 2: Manuelle Neuindexierung mit geänderten Optionen
Wenn Sie Indexoptionen wie
num_leaves,tree_depthusw. ändern müssen, führen Sie die folgenden Schritte aus:- Erstellen Sie einen neuen Vektorindex für dieselbe Einbettungsspalte wie den aktuellen Vektorindex und aktualisieren Sie die Parameter (z. B.
OPTIONS) entsprechend. Nachdem der Index erstellt wurde, können Sie herausfinden, welcher Index besser abschneidet. Spanner entscheidet automatisch, welcher Index bei der Ausführung der Abfrage verwendet wird. Wählen Sie eine der folgenden Methoden aus, um Ihre Indexe zu bewerten und zu vergleichen:
a. Anwendung ändern: Sie können eine Teilmenge Ihrer Abfragen so aktualisieren, dass sie den Hinweis
FORCE_INDEXverwenden, um auf den neuen Index zu verweisen und die Vektorsuchanfrage zu aktualisieren. So wird sichergestellt, dass die Abfrage den neuen Vektorindex verwendet. Bei dieser Methode müssen Sienum_leaves_to_searchin Ihrer neuen Anfrage möglicherweise neu abstimmen.b. Schema ändern: Sie können die Option
disable_searchfür einen Ihrer Vektorindexe festlegen. Wenntruefestgelegt ist, wird der Vektorindex in Spanner deaktiviert. Führen Sie dazu die Anweisung zum Ändern des SchemasALTER VECTOR INDEXaus:ALTER VECTOR INDEX IncidentVectorIndex SET OPTIONS (disable_search=true);Bei dieser Methode wird verhindert, dass Spanner diesen Vektorindex in Ihrer Datenbank verwendet. Wenn Sie zwei Indexe haben und diese Option für den älteren Index festlegen, werden nach der Schemaänderung alle Anfragen mit dem neuen Index ausgeführt. Wenn Sie den Hinweis
FORCE_INDEXverwenden, um einen Vektorindex anzugeben, für den die Optiondisable_searchauftruegesetzt ist, schlägt die Abfrage fehl.Löschen Sie den veralteten Vektorindex.
- Erstellen Sie einen neuen Vektorindex für dieselbe Einbettungsspalte wie den aktuellen Vektorindex und aktualisieren Sie die Parameter (z. B.
Nächste Schritte
Weitere Informationen zu ungefähren nächsten Nachbarn in Spanner
Weitere Informationen zu
VECTOR INDEX-Anweisungen in GoogleSQL