Halten Sie sich an die Best Practices, um Ihre ScaNN-Indexe zu optimieren und ein Gleichgewicht zwischen Such-Recall und Abfragen pro Sekunde (Queries per Second, QPS) zu erreichen. Die empfohlenen Parameter und Werte hängen davon ab, wie viele Ebenen Ihr Index hat.
Informationen zum Erstellen von ScaNN-Indizes finden Sie unter ScaNN-Index erstellen.
Limits
Bevor Sie mit der Optimierung Ihrer ScaNN-Indexe beginnen, sollten Sie das folgende Limit beachten:
num_leavesist auf 30 Millionen begrenzt.
Hinweis
Wenn Sie einen ScaNN-Index mit vier Ebenen erstellen möchten, müssen Sie zuerst die Vorschau-Funktion für Ihre AlloyDB-Instanz aktivieren. Sie haben zwei Möglichkeiten, die Vorschaufunktion zu aktivieren:
Aktivieren Sie das Datenbank-Flag
scann.enable_preview_features.Weitere Informationen zum Konfigurieren von Datenbank-Flags finden Sie unter Datenbank-Flags konfigurieren.
Legen Sie das Datenbank-Flag
scann.max_allowed_num_levelsauf Sitzungsebene auf3fest.SET scann.max_allowed_num_levels = 3;
Zweistufiger Baumindex
So wenden Sie Empfehlungen an, um die optimalen Werte für num_leaves und num_leaves_to_search für Ihren Datensatz zu ermitteln:
- Wenn Sie den für die folgenden Fälle optimierten Index
ScaNNerstellen möchten, legen Sie den Parameternum_leavesauf den folgenden Wert fest, wobei „rows“ die Anzahl der Zeilen in der indexierten Tabelle ist:- Ausgewogene Index-Build-Dauer und ‑qualität: Setzen Sie
num_leavesaufsqrt(rows). - Bei quality wird „num_leaves“ auf „rows/100“ festgelegt.
- Ausgewogene Index-Build-Dauer und ‑qualität: Setzen Sie
- Führen Sie Ihre Testabfragen aus und erhöhen Sie den Wert von
scann.num_of_leaves_to_search, bis Sie den gewünschten Recall-Bereich erreichen, z. B. 95 %. Weitere Informationen zum Analysieren von Abfragen finden Sie unter Abfragen analysieren. - Notieren Sie sich das Verhältnis zwischen
scann.num_leaves_to_searchundnum_leaves, das in den nachfolgenden Schritten verwendet wird. Dieses Verhältnis bietet eine Annäherung an den Datensatz, mit dem Sie den angestrebten Recall erreichen können.
Wenn Sie mit Vektoren mit hoher Dimension (500 Dimensionen oder mehr) arbeiten und den Recall verbessern möchten, versuchen Sie, den Wert vonscann.pre_reordering_num_neighborszu optimieren. Der Standardwert ist auf50 * Kfestgelegt, wobeiKdas Limit ist, das Sie in Ihrer Abfrage festgelegt haben. - Wenn Ihre Rate von Abfragen pro Sekunde zu niedrig ist, nachdem Ihre Anfragen ein bestimmtes Ziel für den Recall erreicht haben, gehen Sie so vor:
- Erstellen Sie den Index neu und erhöhen Sie den Wert von
num_leavesundscann.num_leaves_to_searchgemäß der folgenden Anleitung:- Setzen Sie
num_leavesauf einen größeren Faktor der Quadratwurzel der Anzahl der Zeilen. Wenn der Index beispielsweisenum_leavesauf die Quadratwurzel der Zeilenanzahl festgelegt hat, versuchen Sie, ihn auf das Doppelte der Quadratwurzel festzulegen. Wenn der Wert bereits verdoppelt wurde, versuchen Sie, ihn auf das Dreifache der Quadratwurzel zu setzen. - Erhöhen Sie
scann.num_leaves_to_searchnach Bedarf, um das Verhältnis zunum_leavesbeizubehalten, das Sie in Schritt 3 notiert haben. - Legen Sie für
num_leaveseinen Wert fest, der kleiner oder gleich der Zeilenanzahl geteilt durch 100 ist.
- Setzen Sie
- Führen Sie die Testabfragen noch einmal aus.
Während Sie die Testabfragen ausführen, können Sie mit einer Reduzierung von
scann.num_leaves_to_searchexperimentieren, um einen Wert zu finden, der die Anzahl der Abfragen pro Sekunde erhöht und gleichzeitig den Recall hoch hält. Sie können verschiedene Werte fürscann.num_leaves_to_searchausprobieren, ohne den Index neu erstellen zu müssen.
- Erstellen Sie den Index neu und erhöhen Sie den Wert von
- Wiederholen Sie Schritt 4, bis sowohl die Abfragen pro Sekunde als auch der Recall-Bereich akzeptable Werte erreicht haben.
Baumindex mit drei Ebenen
Zusätzlich zu den Empfehlungen für den ScaNN-Index mit zwei Stufen sollten Sie die folgenden Hinweise beachten.
So wenden Sie Empfehlungen an, um den optimalen Wert der Indexparameter num_leaves und max_num_levels zu ermitteln:
Erstellen Sie den
ScaNN-Index mit den folgendennum_leaves- undmax_num_levels-Kombinationen, die auf Ihren Leistungszielen basieren:- Index-Build-Dauer und ‑qualität ausgleichen: Legen Sie
max_num_levelsals2undnum_leavesalspower(rows, ⅔)fest. - Für Qualität optimieren: Legen Sie
max_num_levelsauf2undnum_leavesaufrows/100fest.
- Index-Build-Dauer und ‑qualität ausgleichen: Legen Sie
Führen Sie Ihre Testabfragen aus. Weitere Informationen zum Analysieren von Abfragen finden Sie unter Abfragen analysieren.
Notieren Sie sich das Verhältnis zwischen
scann.num_leaves_to_searchundnum_leaves, das in den nachfolgenden Schritten verwendet wird. Dieses Verhältnis bietet eine Schätzung für das Dataset, mit dem Sie den angestrebten Recall erreichen können.
Wenn Sie mit Vektoren mit vielen Dimensionen (500 oder mehr) arbeiten und den Recall verbessern möchten, versuchen Sie, den Wert von scann.pre_reordering_num_neighbors zu optimieren. Der Standardwert ist auf 50 * K festgelegt, wobei K das Limit ist, das Sie in Ihrer Abfrage festgelegt haben.
Wenn Ihre Rate von Abfragen pro Sekunde zu niedrig ist, nachdem Ihre Anfragen ein bestimmtes Ziel für den Recall erreicht haben, gehen Sie so vor:
- Erstellen Sie den Index neu und erhöhen Sie die Werte von
num_leavesundscann.num_leaves_to_searchgemäß der folgenden Anleitung: - Setzen Sie
num_leavesauf einen größeren Faktor vonpower(rows, ⅔). Wenn der Index beispielsweisenum_leavesaufpower(rows, ⅔)gesetzt hat, versuchen Sie, ihn auf das Doppelte vonpower(rows, ⅔)zu setzen. Wenn der Wert bereits doppelt ist, versuchen Sie, ihn auf das Dreifache vonpower(rows, ⅔)zu setzen. - Erhöhen Sie
scann.num_leaves_to_searchnach Bedarf, um das Verhältnis zunum_leavesbeizubehalten, das Sie in Schritt 3 notiert haben. - Setzen Sie
num_leavesauf einen Wert, der kleiner oder gleichrows/100ist. - Führen Sie die Testabfragen noch einmal aus. Während Sie die Testabfragen ausführen, können Sie mit einer Reduzierung von
scann.num_leaves_to_searchexperimentieren, um einen Wert zu finden, der die Anzahl der Abfragen pro Sekunde erhöht und gleichzeitig den Recall hoch hält. Sie können verschiedene Werte fürscann.num_leaves_to_searchausprobieren, ohne den Index neu erstellen zu müssen.
- Erstellen Sie den Index neu und erhöhen Sie die Werte von
Wiederholen Sie Schritt 4, bis sowohl die Abfragen pro Sekunde als auch der Recall-Bereich akzeptable Werte erreicht haben.
Baumindex mit vier Ebenen
Zusätzlich zu den Empfehlungen für Indexe mit drei Ebenen sollten Sie die folgenden Hinweise beachten, um den optimalen Wert für num_leaves und max_num_levels zu ermitteln:
Erstellen Sie einen ScaNN-Index mit den folgenden
num_leaves- undmax_num_levels-Kombinationen, die auf Ihren Leistungszielen basieren:Index-Build-Dauer und ‑qualität ausgleichen: Legen Sie
max_num_levelsauf3undnum_leavesaufpower(ROWS, 3/4)fest.Für Qualität optimieren: Legen Sie
max_num_levelsauf3undnum_leavesaufROWS/100fest.
Führen Sie Ihre Testabfragen aus. Weitere Informationen zum Analysieren von Abfragen finden Sie unter Abfragen analysieren.
Notieren Sie sich das Verhältnis zwischen
scann.num_leaves_to_searchundnum_leaves. Sie verwenden dieses Verhältnis, um in den folgenden Schritten die angestrebte Erinnerung zu erreichen.Wenn Sie mit Vektoren mit vielen Dimensionen (500 oder mehr) arbeiten und den Recall verbessern möchten, versuchen Sie, den Wert von
scann.pre_reordering_num_neighborszu optimieren.Wenn Ihre Rate von Abfragen pro Sekunde zu niedrig ist, nachdem Ihre Anfragen ein bestimmtes Ziel für den Recall erreicht haben, erstellen Sie den Index neu und erhöhen Sie den Wert von
num_leavesundscann.num_leaves_to_searchgemäß der folgenden Anleitung:Setzen Sie
num_leavesauf einen größeren Faktor vonpower(ROWS, 3/4). Wenn der Index beispielsweisenum_leavesaufpower(ROWS, 3/4)gesetzt hat, versuchen Sie, ihn auf das Doppelte vonpower(ROWS, 3/4)zu setzen. Wenn der Wert bereits verdoppelt wurde, versuchen Sie, ihn auf das Dreifache zu setzen.Erhöhen Sie
scann.num_leaves_to_searchnach Bedarf, um das Verhältnis zunum_leavesbeizubehalten, das Sie in Schritt 3 notiert haben.Setzen Sie
num_leavesauf einen Wert, der kleiner oder gleichROWS/100ist.Führen Sie die Testabfragen noch einmal aus. Während Sie die Testabfragen ausführen, können Sie mit einer Reduzierung von
scann.num_leaves_to_searchexperimentieren. Suchen Sie nach einem Wert, der die Anzahl der Abfragen pro Sekunde erhöht und gleichzeitig den Recall hoch hält. Sie können verschiedene Werte fürscann.num_leaves_to_searchausprobieren, ohne den Index neu erstellen zu müssen.
Wiederholen Sie Schritt 4, bis sowohl der Recall-Bereich als auch die Abfragen pro Sekunde akzeptable Werte erreichen.
Recall für gefilterte Suchanfragen verbessern
Wenn Sie eine KNN-Vektorsuche (K-Nearest Neighbor) mit einem Filter ausführen, kann es vorkommen, dass die Abfrage weniger Ergebnisse zurückgibt als in der LIMIT-Klausel angefordert. Das kann zu unzureichendem Recall führen und tritt wahrscheinlicher auf, wenn Sie sehr selektive Filter verwenden. Das liegt daran, dass die ursprünglichen Partitionen oder Blätter, die von ScaNN durchsucht werden, nicht genügend Vektoren enthalten, die die Filterbedingungen erfüllen.
Um dieses Problem zu beheben, bietet AlloyDB eine Funktion, mit der die Suche dynamisch über die ursprüngliche Menge an Blättern hinaus erweitert werden kann, um genügend passende Ergebnisse zu finden.
So funktioniert das Streaming
Sie können die Streamingfunktion aktivieren, indem Sie den Parameter scann.satisfy_limit auf relaxed_order setzen. Wenn diese Option aktiviert ist, wird die Vektorsuche in zusätzlichen Blattpartitionen fortgesetzt, bis genügend Ergebnisse gefunden wurden, um die LIMIT Ihrer Anfrage zu erfüllen. Dadurch wird die Trefferquote verbessert.
Mit dem Parameter scann.max_pct_leaves_to_search können Sie verhindern, dass eine Suche zu lange dauert, und die Auswirkungen auf die Leistung steuern. Diese Einstellung dient als Schutzmaßnahme, indem sie eine Obergrenze für den Prozentsatz der insgesamt besuchten Blätter festlegt, die eine Abfrage besuchen kann. Der Standardwert dafür ist 15%.
Wann sollte Streaming verwendet werden?
Sie sollten die Streamingfunktion verwenden, wenn Folgendes zutrifft:
- Sie verwenden Filter bei Ihren Vektorsuchen.
- Sie stellen fest, dass Ihre Abfragen weniger Ergebnisse zurückgeben, als Sie aufgrund Ihrer
LIMIT-Klausel erwarten.
Wenn Sie scann.satisfy_limit aktivieren, können Sie den Recall Ihrer gefilterten Suchanfragen verbessern. Es wird empfohlen, auch scann.max_pct_leaves_to_search zu konfigurieren, um ein Gleichgewicht zwischen Trefferquote und Abfrageleistung zu erreichen.
Indexwartung
Wenn Ihre Tabelle häufig aktualisiert wird oder neue Zeilen eingefügt werden, empfehlen wir, den vorhandenen ScaNN-Index regelmäßig neu zu indexieren, um die Genauigkeit des Recall zu verbessern.
Sie können Indexmesswerte beobachten, um Änderungen an Vektorverteilungen oder Vektormutationen seit der Erstellung des Index zu sehen, und den Index dann entsprechend neu indexieren. Weitere Informationen zu Messwerten finden Sie unter Messwerte für Vektorindex aufrufen.