Wenn Sie Ihre Vektorindexe in AlloyDB for PostgreSQL optimieren, können Sie die Ausführungsgeschwindigkeit von Abfragen und die Suchergebnisse für Ihre Vektorsucharbeitslasten verbessern. Sie können Indexerstellungs- und Suchparameter für ScaNN-, IVF-, IVFFlat- und HNSW-Indexe an Ihre Datasetgröße und Leistungsanforderungen anpassen.
Hinweis
Bevor Sie einen ScaNN-Index erstellen, führen Sie folgende Schritte aus:
Erstellen Sie eine Tabelle mit Ihren Daten.
Damit beim Erstellen des ScaNN-Index keine Probleme mit dem Arbeitsspeicher auftreten, müssen die
maintenance_work_memundshared_buffersDatenbank-Flags auf einen Wert festgelegt sein, der kleiner als der gesamte Arbeitsspeicher der Maschine ist.Wenn Sie Indexe mit vier Ebenen verwenden möchten, müssen Sie zuerst die Vorschau-Funktion für Ihre AlloyDB-Instanz aktivieren. Wählen Sie eine der folgenden beiden Methoden aus, um die Vorschaufunktion zu aktivieren:
Aktivieren Sie das
scann.enable_preview_featuresDatenbank-Flag.Weitere Informationen zum Konfigurieren von Datenbank-Flags finden Sie unter Datenbank-Flags konfigurieren.
Legen Sie das Datenbank-Flag auf Sitzungsebene
scann.max_allowed_num_levelsauf3fest.SET scann.max_allowed_num_levels = 3;
ScaNN-Index optimieren
In der folgenden Tabelle finden Sie die Anzahl der Ebenen, die für Ihren ScaNN-Index erforderlich sind.
| Anzahl der Vektorzeilen in der Tabelle | Anzahl der Ebenen für Ihren ScaNN-Index |
|---|---|
| [0 bis 10 Millionen] | Zwei |
| [10 Millionen bis 100 Millionen] |
Wählen Sie einen der folgenden Messwerte aus, der Priorität haben soll:
|
| [100 Millionen bis 1 Milliarde] |
Wählen Sie einen der folgenden Messwerte aus, der Priorität haben soll:
|
| [1 Milliarde bis 10 Milliarden] | Vier (in der Vorschau) |
Verwenden Sie die folgenden ScaNN-Indexe als Beispiele für die Optimierung von Parametern für eine Tabelle mit 1 Million Zeilen.
Zweistufiger Baumindex
SET LOCAL scann.num_leaves_to_search = 1; SET LOCAL scann.pre_reordering_num_neighbors=50; CREATE INDEX my_scann_index ON my_table USING scann (vector_column cosine) WITH (num_leaves = [power(1000000, 1/2)]);
Baumindex mit drei Ebenen
SET LOCAL scann.num_leaves_to_search = 10; SET LOCAL scann.pre_reordering_num_neighbors=50; CREATE INDEX my_scann_index ON my_table USING scann (vector_column cosine) WITH (num_leaves = [power(1000000, 2/3)], max_num_levels = 2);
Baumindex mit vier Ebenen
SET LOCAL scann.num_leaves_to_search = 100; SET LOCAL scann.pre_reordering_num_neighbors=50; CREATE INDEX my-scann-index ON my-table USING scann (vector_column cosine) WITH (num_leaves = [power(1000000, 3/4)], max_num_levels = 3);
Weitere Informationen zu ScaNN-Indexen finden Sie auf den folgenden Seiten:
DML-Invalidierungen aufgrund der Beschleunigung mit der spaltenbasierten Engine verarbeiten
Wenn Sie Ihre Vektorsuchen mit der spaltenbasierten Engine
beschleunigen, können sich DML- und DDL
Invalidierungen in den Basistabellen auf die Leistung von Vektorabfragen auswirken. Bei hohem DML-Durchsatz sollten Sie das Datenbank-Flag google_columnar_engine.refresh_threshold_percentage optimieren oder den Index manuell mit dem Befehl google_columnar_engine_refresh_index aktualisieren.
Abfragen analysieren
Verwenden Sie den Befehl EXPLAIN ANALYZE, um Ihre Query Insights zu analysieren, wie in der folgenden SQL-Abfrage gezeigt.
EXPLAIN ANALYZE SELECT result-column
FROM my_table
ORDER BY EMBEDDING_COLUMN <-> embedding('text-embedding-005', 'What is a database?')::vector
LIMIT 1;
Die Beispielantwort QUERY PLAN enthält Informationen wie die benötigte Zeit, die Anzahl der gescannten oder zurückgegebenen Zeilen und die verwendeten Ressourcen.
Limit (cost=0.42..15.27 rows=1 width=32) (actual time=0.106..0.132 rows=1 loops=1)
-> Index Scan using my_scann_index on my_table (cost=0.42..858027.93 rows=100000 width=32) (actual time=0.105..0.129 rows=1 loops=1)
Order By: (embedding_column <-> embedding('text-embedding-005', 'What is a database?')::vector(768))
Limit value: 1
Planning Time: 0.354 ms
Execution Time: 0.141 ms
Messwerte für Vektorindex ansehen
Mit Messwerten für Vektorindex können Sie die Leistung Ihres Vektorindex überprüfen, Bereiche für Verbesserungen identifizieren und den Index bei Bedarf anhand der Messwerte optimieren. Die Ansicht pg_stat_ann_indexes gibt Aufschluss über den Status der Indexnutzung, während die Ansicht pg_stat_ann_index_creation Informationen zu den Zeilen enthält, die zum Zeitpunkt der Indexerstellung erstellt wurden.
Führen Sie den folgenden Befehl aus, um Messwerte zur Indexnutzung aufzurufen:
SELECT * FROM pg_stat_ann_indexes;
Die Ausgabe sollte in etwa so aussehen:
-[ RECORD 1 ]----------+---------------------------------------------------------------------------
relid | 271236
indexrelid | 271242
schemaname | public
relname | t1
indexrelname | t1_ix1
indextype | scann
indexconfig | {num_leaves=100,max_num_levels=1,quantizer=SQ8}
indexsize | 832 kB
indexscan | 0
insertcount | 250
deletecount | 0
updatecount | 0
partitioncount | 100
distribution | {"average": 3.54, "maximum": 37, "minimum": 0, "outliers": [37, 12, 11, 10, 10, 9, 9, 9, 9, 9]}
distributionpercentile |{"10": { "num_vectors": 0, "num_partitions": 0 }, "25": { "num_vectors": 0, "num_partitions": 30 }, "50": { "num_vectors": 3, "num_partitions": 30 }, "75": { "num_vectors": 5, "num_partitions": 19 }, "90": { "num_vectors": 7, "num_partitions": 11 }, "95": { "num_vectors": 9, "num_partitions": 5 }, "99": { "num_vectors": 12, "num_partitions": 4 }, "100": { "num_vectors": 37, "num_partitions": 1 }}
Führen Sie den folgenden Befehl aus, um die Anzahl der Zeilen aufzurufen, die zum Zeitpunkt der Indexerstellung erstellt wurden:
SELECT * FROM pg_stat_ann_index_creation;
Die Ausgabe sollte in etwa so aussehen:
-[ RECORD 1 ]----------+---------------------------------------------------------------------------
relid | 271236
indexrelid | 271242
schemaname | public
relname | t1
indexrelname | t1_ix1
index_rows_at_creation_time | 262144
Weitere Informationen zur vollständigen Liste der Messwerte finden Sie unter Messwerte für Vektorindex.
Nächste Schritte
- Vektorindexe verwalten.
- Beispiel für einen Einbettungsworkflow