Best Practices für die Vektorindexierung

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

Die optimalen Werte für Ihre Vektorindexoptionen hängen von Ihrem Anwendungsfall, dem Vektordatensatz und den Abfragevektoren ab. Sie können diese Werte festlegen und optimieren , indem Sie einen neuen Vektorindex erstellen und index_option_list in der Anweisung CREATE VECTOR INDEX festlegen. 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 eine tree_depth von 2. Andernfalls unterstützt eine tree_depth von 3 Tabellen mit bis zu etwa 10 Milliarden Zeilen.

  • num_leaves: Verwenden Sie die Quadratwurzel der Anzahl der Zeilen im Datensatz. Ein größerer Wert kann die Build-Dauer des Vektorindex verlängern. Legen Sie für num_leaves keinen Wert fest, der größer als table_row_count geteilt durch 1.000 ist, da dies zu zu kleinen Blättern und einer schlechten Leistung führt.

  • num_leaves_to_search: Mit dieser Option wird angegeben, wie viele Blattknoten des Index durchsucht werden. Wenn Sie num_leaves_to_search erhöhen, verbessert sich der Recall, aber auch die Latenz und die Kosten steigen. Wir empfehlen, als Wert für num_leaves_to_search eine Zahl zu verwenden, die 1% der Gesamtzahl der Blätter entspricht, die in der Anweisung CREATE VECTOR INDEX definiert sind. 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 Anzahl von Abfragen pro Sekunde führt, versuchen Sie, num_leaves zu erhöhen. Gehen Sie dazu so vor:

  1. Setzen Sie num_leaves auf ein Vielfaches k des ursprünglichen Werts (z. B. 2 * sqrt(table_row_count)).
  2. Setzen Sie num_leaves_to_search auf dasselbe Vielfache k des ursprünglichen Werts.
  3. Experimentieren Sie mit einer Reduzierung von num_leaves_to_search, um die Kosten und die Anzahl der Abfragen pro Sekunde zu verbessern und gleichzeitig den Recall beizubehalten.

Recall verbessern

Wenn Sie den Recall verbessern möchten, können Sie den Wert num_leaves_to_search optimieren oder Ihren Vektorindex neu erstellen.

Wenn der Wert von 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:

  1. 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.
  2. 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_INDEX Hinweis 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öglicherweise num_leaves_to_search in Ihrer neuen Abfrage neu optimieren.

    b. Schema ändern: Sie können die Option disable_search für einen Ihrer Vektorindexe festlegen. Wenn die Option auf true gesetzt ist, deaktiviert Spanner den Vektorindex. Dazu führen Sie die Anweisung zur Schemaänderung ALTER VECTOR INDEX aus:

      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 Schemaänderung den neuen Index. Wenn Sie den Hinweis FORCE_INDEX verwenden, um einen Vektorindex anzugeben, für den die Option disable_search auf true gesetzt ist, schlägt die Abfrage fehl.

  3. Löschen Sie den veralteten Vektorindex.

Nächste Schritte