Dieses Dokument enthält Empfehlungen zur Optimierung der Leistung der Vektorsuche in Spanner.
Spanner-Grundlagen
Für effektive Leistungstests der Spanner-Vektorsuche sind Spanner-Grundlagen erforderlich. Wenn Sie beispielsweise dieselbe Abfrage sofort noch einmal ausführen, kann das aufgrund von Caches schneller gehen. Wenn Sie die Leistung einer Anwendung testen möchten, die hauptsächlich warme Daten verwendet, führen Sie zuerst einen Warm-up-Lesevorgang durch.
Weitere Informationen finden Sie in den folgenden Anleitungen:
- Leistungsübersicht
- Best Practices für SQL
- K-Nearest Neighbors-Suche (KNN) durchführen
- ANN-Suche (Approximate Nearest Neighbors) mit Vektorindexen ausführen
- Best Practices für die Vektorindexierung
Spanner verarbeitet Abfragen parallel auf Grundlage von Datenbank-Splits. Tests mit einer anhaltenden Produktionsabfragelast können lastbasiertes Aufteilen ermöglichen, wodurch die Abfrageleistung durch erhöhte Parallelität verbessert wird. Um die Parallelität für zukünftige Lasten zu erhöhen, sollten Sie Ihre Datenbank vorspalten, insbesondere für KNN.
Best Practices für die Vektorsuche
In diesem Dokument werden die folgenden Best Practices für die Vektorsuche beschrieben:
- Einbettungsspalte mit Anmerkungen versehen
- Top‑k-Abfrage verwenden
- SQL-Literale für die
LIMIT-Klausel verwenden - Batchorientiertes Scannen verwenden
- KNN für kleine Datasets verwenden
- ANN für große Datasets verwenden
Einbettungsspalte mit Anmerkungen versehen
Kommentieren Sie die Spalte für Einbettungen mit vector_length.
Diese Anmerkung ermöglicht Leistungsoptimierungen für die K-Nearest Neighbor (KNN)-Suche und ist eine Voraussetzung für die Approximate Nearest Neighbor (ANN)-Suche.
Top-k-Abfrage verwenden
Verwenden Sie eine ORDER BY-Klausel mit LIMIT, um die nächsten Nachbarn zu finden. Top-k-Anfragen sind für die Vektorsuche optimiert. Vermeiden Sie das Filtern nach einem Distanzschwellenwert in einer WHERE-Klausel.
Das folgende Beispiel ist nicht empfehlenswert:
SELECT d.DocId
FROM Documents AS d
WHERE COSINE_DISTANCE(d.DocEmbedding, @vector) < 1;
Verwenden Sie stattdessen:
SELECT d.DocId
FROM Documents AS d
ORDER BY COSINE_DISTANCE(d.DocEmbedding, @vector)
LIMIT 10;
Die Verwendung einer Top-k-Abfrage ist nicht nur einfacher, da die Abstimmung des Distanzschwellenwerts entfällt, sondern ermöglicht auch Leistungsoptimierungen, die speziell für die Vektorsuche entwickelt wurden.
SQL-Literale für die LIMIT-Klausel verwenden
Wenn das Top-k-Limit festgelegt ist, verwenden Sie ein SQL-Literal anstelle eines Parameters. Verwenden Sie beispielsweise LIMIT 10 anstelle von LIMIT @limit. Dadurch erhält das Abfrageoptimierungstool von Spanner mehr Informationen, um den besten Abfrageausführungsplan auszuwählen.
Batchorientiertes Scannen verwenden
Vektorsuchanfragen sind scanintensiv. Für KNN-Abfragen sollten Sie den batchorientierten Scan mit dem Hinweis zur Abfrage scan_method=batch verwenden.
Dies ist die standardmäßige Scanmethode für ANN-Abfragen.
KNN für kleine Datasets verwenden
Wenn KNN für Ihr Latenzbudget ausreicht, erstellen Sie keinen Vektorindex. KNN ist genauer, vermeidet Kosten für die Indexerstellung und ‑wartung und kann besser als ANN abschneiden, wenn die Anzahl der Eingabezeilen nach dem Filtern gering ist.
Gefilterten KNN-Algorithmus mit einem sekundären Index beschleunigen
Um die Leistung einer gefilterten KNN-Abfrage zu verbessern, erstellen Sie einen sekundären Index für die Filterspalte. Betrachten Sie beispielsweise die folgende Abfrage:
SELECT d.DocId
FROM Documents AS d
WHERE Category = 'toy'
ORDER BY COSINE_DISTANCE(d.DocEmbedding, @vector)
LIMIT 10;
Wenn die Anzahl der Dokumente pro Kategorie weniger als einige Zehntausend beträgt und Ihre Anwendung eine Abfragelatenz von 100 ms akzeptieren kann, erstellen Sie einen sekundären Index für die Spalte Category. Speichern Sie die Spalte DocEmbedding im Index:
CREATE INDEX ON Documents(Category) STORING (DocEmbedding);
Durch das Erstellen dieses Index wird die gefilterte Abfrage beschleunigt.
ANN für große Datasets verwenden
Wenn die Anzahl der Zeilen nach der Auswertung von Filtern groß ist, erstellen Sie einen Vektorindex und verwenden Sie die ANN-Suche. Es gibt mehrere Techniken, mit denen sich das Filtern mit ANN beschleunigen lässt:
Filterspalten speichern: Wenn Sie beim Durchsuchen des Vektors filtern möchten, speichern Sie Filterspalten im Vektorindex. So können nicht qualifizierte Zeilen frühzeitig entfernt werden.
CREATE VECTOR INDEX ON Documents(DocEmbedding) STORING(Category);Wichtige Filterspalten: Wenn Sie das Filtern nach hochselektiven Spalten beschleunigen möchten, durch die viele Ergebnisse entfernt werden, organisieren Sie diese Spalten als zusätzliche Schlüsselspalten im Vektorindex. Abfragen, in denen die genaue Gleichheit (mit dem Operator
=) für diese zusätzlichen Schlüssel angegeben wird, werden am stärksten beschleunigt. Wenn Sie dieIN-Klausel für einen dieser zusätzlichen Schlüssel verwenden, wird nicht dasselbe Beschleunigungsniveau erreicht.CREATE VECTOR INDEX ON Documents(DocEmbedding, Category);Vermeiden Sie das Speichern großer Spalten oder die Verwendung großer Spalten als Schlüssel: Dadurch können die Datenblöcke für Einbettungen verdünnt werden, was die Leseeffizienz verringern kann. Alternativ können Sie eine Hash-Spalte im Index verwenden und die ursprüngliche große Spalte als Postfilter nach den Top-k-Ergebnissen.
Gefilterten (partiellen) Vektorindex erstellen:Wenn Sie nur eine Teilmenge des Datasets abfragen und diese Teilmenge durch eine Filterbedingung wie
Category = "Tech"definiert wird, erstellen Sie einen gefilterten oder partiellen Vektorindex.