Leistung von Vektorabfragen in AlloyDB for PostgreSQL optimieren

Auf dieser Seite wird beschrieben, wie Sie Ihre Indexe optimieren, um die Abfrageleistung zu verbessern und die Abrufrate in AlloyDB for PostgreSQL zu erhöhen.

Hinweis

Führen Sie die folgenden Schritte aus, bevor Sie einen ScaNN-Index erstellen:

  • 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 Vorschau-Funktion 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 den ScaNN-Index
[0 bis 10 Millionen] Zwei
[10 Millionen bis 100 Millionen]

Wählen Sie eine der folgenden Messwerte aus, die priorisiert werden sollen:

  • Abrufrate bei der Suche: zwei
  • Indexerstellungszeit: drei
[100 Millionen bis 1 Milliarde]

Wählen Sie eine der folgenden Messwerte aus, die priorisiert werden sollen:

  • Abrufrate bei der Suche: 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)]);

Dreistufiger Baumindex

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);

Vierstufiger Baumindex

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 möchten, beachten Sie, dass sich DML- und DDL Invalidierungen in den Basistabellen auf die Leistung von Vektorabfragen auswirken können. Bei einem hohen 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 Abfrage-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 anzeigen

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 anzuzeigen:

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 anzuzeigen, 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