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. Für fortgeschrittene Nutzer, die die
Optionen für den Vektorindex für ihre spezifische Arbeitslast optimieren möchten, können Sie diese
Werte festlegen und optimieren, indem Sie einen neuen Vektorindex erstellen und die
index_option_list
in der CREATE VECTOR INDEX Anweisung festlegen. Die optimalen Werte für Ihre Optionen für den Vektorindex hängen von Ihrem Anwendungsfall, dem Vektordatensatz und den Abfragevektoren ab. Möglicherweise müssen Sie iterative Optimierungen vornehmen, 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 einetree_depthvon2. Andernfalls unterstützt einetree_depthvon3Tabellen mit bis zu etwa 10 Milliarden Zeilen. Wenn nicht angegeben, bestimmt Spanner automatisch den Wert fürtree_depth.num_leaves: Wir empfehlen, 200 bis 1.000 Zeilen pro Blatt anzustreben. 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 bei der Suche in vielen sehr kleinen Blattclustern wieder steigen. Wenn nicht angegeben, bestimmt Spanner automatisch den Wert fürnum_leaves.num_branches: Diese Option ist nur anwendbar, wenntree_depth3 ist. Wir empfehlen, 50 bis 500 Blätter pro Zweig anzustreben.num_branchessollte kleiner alsnum_leavessein. Ein größerer Wert fürnum_branchesverlängert die Build-Dauer des 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 bei der Suche in vielen sehr kleinen Blattclustern wieder steigen. Wenn nicht angegeben, bestimmt Spanner automatisch den Wert fürnum_branches.num_leaves_to_search: Mit dieser Option wird angegeben, wie viele Blattknoten des Index durchsucht werden. Wenn Sienum_leaves_to_searcherhöhen, verbessert sich der Recall, aber auch die Latenz und die Kosten steigen. Wir empfehlen, als Wert fürnum_leaves_to_searcheine Zahl zu verwenden, die 1% der Gesamtzahl der in der AnweisungCREATE VECTOR INDEXdefinierten Blätter entspricht. Wenn Sie eine Filterklausel verwenden, erhöhen Sie diesen Wert, um die Suche zu erweitern.
Wenn ein akzeptabler Recall erreicht wird, die Kosten für die Abfrage jedoch zu hoch sind, was zu einer niedrigen maximalen Rate von Abfragen pro Sekunde führt, versuchen Sie, num_leaves zu erhöhen. Gehen Sie dazu so vor:
- Legen Sie für
num_leavesein Vielfacheskdes ursprünglichen Werts fest (z. B.2 * (table_row_count / 1000)). - Legen Sie für
num_leaves_to_searchdas gleiche Vielfache `k` des ursprünglichen Werts fest. - Experimentieren Sie damit,
num_leaves_to_searchzu verringern, um die Kosten und die Rate von Abfragen pro Sekunde zu verbessern und gleichzeitig den Recall beizubehalten.
Werte für die Optionen für die Vektorsuche bestimmen
Wenn Sie die Parameter tree_depth, num_leaves und num_branches bestimmen möchten, die Spanner für den Vektorindex verwendet, fragen Sie die Ansicht INFORMATION_SCHEMA.INDEX_OPTIONS ab. Die Parameterwerte können leicht von den Werten abweichen, die Sie bei der Indexerstellung explizit angegeben haben, da Spanner sie manchmal an Ihre Daten anpasst.
Wenn Sie diese Parameter nicht angegeben haben, zeigt die Ansicht INFORMATION_SCHEMA.INDEX_OPTIONS die von Spanner ausgewählten Werte.
Führen Sie diese Abfrage aus, um die Parameterwerte anzuzeigen:
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 mit option_name zurück, darunter system_optimized_tree_depth, system_optimized_num_leaves und system_optimized_num_branches. Diese Werte spiegeln die vom Index verwendeten Parameter wider.
Recall verbessern
Wenn Sie den Recall verbessern möchten, können Sie den Wert num_leaves_to_search optimieren oder Ihren Vektorindex neu erstellen.
Wert für num_leaves_to_search erhöhen
Wenn der Wert für num_leaves_to_search zu klein ist, kann es schwieriger sein, die nächsten Nachbarn für einige Abfragevektoren zu finden. Wenn Sie einen neuen Vektorindex mit einem erhöhten Wert für num_leaves_to_search erstellen, kann der Recall verbessert werden, da mehr Blätter durchsucht werden. Aktuelle Abfragen enthalten möglicherweise mehr dieser schwierigen Vektoren.
Vektorindex neu erstellen
Die Baumstruktur des Vektorindex ist zum Zeitpunkt der Erstellung für den Datensatz optimiert und bleibt danach statisch. Wenn nach der Erstellung des ursprünglichen Vektorindex deutlich unterschiedliche Vektoren hinzugefügt werden, ist die Baumstruktur möglicherweise nicht optimal, was zu einem schlechteren Recall führt.
So erstellen Sie Ihren Vektorindex ohne Ausfallzeit neu:
- Erstellen Sie einen neuen Vektorindex für dieselbe Einbettungsspalte wie den aktuellen Vektorindex und aktualisieren Sie die Parameter (z. B.
OPTIONS) nach Bedarf. Nachdem die Indexerstellung abgeschlossen ist, können Sie prüfen, welcher Ihrer beiden Indexe besser funktioniert. Wenn ja, fahren Sie mit dem nächsten Schritt fort. Andernfalls fahren Sie mit dem Löschen des veralteten Vektorindex fort. Spanner entscheidet automatisch, welcher Index bei der Ausführung der Abfrage verwendet wird. Spanner bietet zwei Möglichkeiten, den zu verwendenden Index anzugeben. 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
FORCE_INDEXHinweis verwenden, um auf den neuen Index zu verweisen und die Vektorsuchabfrage zu aktualisieren. So wird sichergestellt dass die Abfrage den neuen Vektorindex verwendet. Bei dieser Methode müssen Sie möglicherweisenum_leaves_to_searchin Ihrer neuen Abfrage neu optimieren.b. Schema ändern: Sie können die Option
disable_searchfür einen Ihrer Vektorindexe festlegen. Wenn diese Option auftruegesetzt ist, deaktiviert Spanner den Vektorindex. Dazu führen Sie die Anweisung zur SchemaänderungALTER VECTOR INDEXaus:ALTER VECTOR INDEX IncidentVectorIndex SET OPTIONS (disable_search=true);Mit 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, verwenden alle Abfragen nach der Anwendung der Schemaänderung den neuen Index. 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.
Nächste Schritte
Weitere Informationen zu Spanner Vektorindexen.
Weitere Informationen zu Spanner ANN.
Weitere Informationen zu den GoogleSQL
APPROXIMATE_COSINE_DISTANCE(),APPROXIMATE_EUCLIDEAN_DISTANCE(),APPROXIMATE_DOT_PRODUCT()Funktionen.Weitere Informationen zu den GoogleSQL
VECTOR INDEXAnweisungen.