Leistung von Vektorabfragen in AlloyDB for PostgreSQL optimieren

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_mem und shared_buffers Datenbank-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:

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:

  • Suchergebnisse: zwei
  • Indexerstellungszeit: drei
[100 Millionen bis 1 Milliarde]

Wählen Sie einen der folgenden Messwerte aus, der Priorität haben soll:

  • Suchergebnisse: drei
  • Indexerstellungszeit: vier (in der Vorschau)
[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