Ottimizzare le prestazioni delle query vettoriali in AlloyDB per PostgreSQL

Scopri come ottimizzare i seguenti indici vettoriali per ottenere prestazioni delle query più veloci e un migliore richiamo in AlloyDB per PostgreSQL:

Puoi anche analizzare le query e visualizzare le metriche dell'indice vettoriale per monitorare e migliorare le prestazioni delle query.

Prima di iniziare

Prima di creare un indice ScaNN, completa le seguenti operazioni:

  • Assicurati che sia già stata creata una tabella con i tuoi dati.
  • Per evitare problemi durante la generazione dell'indice, assicurati che il valore impostato per i flag maintenance_work_mem e shared_buffers sia inferiore alla memoria totale della macchina .

Ottimizzare un indice ScaNN

Utilizza le seguenti indicazioni per scegliere tra un indice ScaNN a due livelli e uno a tre livelli:

  • Scegli un indice a due livelli se il numero di righe del vettore è inferiore a 10 milioni.
  • Scegli un indice a tre livelli se il numero di righe del vettore supera i 100 milioni.
  • Scegli un indice a tre livelli per ottimizzare il tempo di creazione dell'indice o un indice a due livelli per ottimizzare il recupero della ricerca se il numero di righe vettoriali è compreso tra 10 milioni e 100 milioni di righe.

Considera i seguenti esempi per gli indici ScaNN a due e tre livelli che mostrano come vengono impostati i parametri di ottimizzazione per una tabella con 1.000.000 di righe:

Indice a due livelli

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 = 1000); -- Note: 1000 is the square root of 1,000,000 rows.

Indice a tre livelli

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 = 10000, max_num_levels = 2);

Per ottimizzare il bilanciamento tra richiamo e QPS durante l'ottimizzazione degli indici ScaNN, consulta Best practice per l'ottimizzazione degli indici ScaNN.

Analizzare le query

Utilizza il comando EXPLAIN ANALYZE per analizzare gli approfondimenti sulle query come mostrato nella seguente query SQL di esempio.

  EXPLAIN ANALYZE SELECT result-column
  FROM my-table
  ORDER BY EMBEDDING_COLUMN <=> embedding('text-embedding-005', 'What is a database?')::vector
  LIMIT 1;

La risposta di esempio QUERY PLAN include informazioni quali il tempo impiegato, il numero di righe scansionate o restituite e le risorse utilizzate.

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

Visualizzare le metriche dell'indice vettoriale

Puoi utilizzare le metriche dell'indice vettoriale per esaminare il rendimento dell'indice vettoriale, identificare le aree di miglioramento e ottimizzare l'indice in base alle metriche, se necessario.

Per visualizzare tutte le metriche dell'indice vettoriale, esegui la seguente query SQL, che utilizza la vista pg_stat_ann_indexes:

SELECT * FROM pg_stat_ann_indexes;

Vedi un output simile al seguente:

-[ RECORD 1 ]----------+---------------------------------------------------------------------------
relid                  | 271236
indexrelid             | 271242
schemaname             | public
relname                | t1
indexrelname           | t1_ix1
indextype              | scann
indexconfig            | {num_leaves=100,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 }}

Per saperne di più sull'elenco completo delle metriche, consulta Metriche dell'indice vettoriale.

Passaggi successivi