Ottimizzare le prestazioni delle query vettoriali in AlloyDB per PostgreSQL

Questa pagina descrive come ottimizzare gli indici per ottenere prestazioni delle query più veloci e un migliore richiamo in AlloyDB per PostgreSQL.

Ottimizzare un indice IVF

La regolazione dei valori impostati per i parametri lists, ivf.probes e quantizer potrebbe contribuire a ottimizzare il rendimento dell'applicazione:

Parametro di ottimizzazione Descrizione Tipo di parametro
lists Il numero di elenchi creati durante la creazione dell'indice. Il punto di partenza per impostare questo valore è (rows)/1000 per un massimo di un milione di righe e sqrt(rows) per più di un milione di righe. Creazione dell'indice
quantizer Il tipo di quantizzatore che vuoi utilizzare per l'albero K-means. Il valore predefinito è SQ8 per migliorare il rendimento delle query. Imposta il valore su FLAT per un migliore ricordo. Creazione dell'indice
ivf.probes il numero di elenchi più vicini da esplorare durante la ricerca. Il punto di partenza per questo valore è
sqrt(lists).
Tempo di esecuzione della query

Considera l'esempio seguente che mostra un indice IVF con i parametri di ottimizzazione impostati:

SET LOCAL ivf.probes = 10;

CREATE INDEX my-ivf-index ON my-table
  USING ivf (vector_column cosine)
  WITH (lists = 100, quantizer = 'SQ8');

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. La visualizzazione pg_stat_ann_indexes ti aiuta a comprendere lo stato di utilizzo dell'indice, mentre la visualizzazione pg_stat_ann_index_creation fornisce informazioni sulle righe create al momento della creazione dell'indice.

Per visualizzare le metriche di utilizzo dell'indice, esegui questo comando:

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 visualizzare il numero di righe create al momento della creazione dell'indice, esegui questo comando:

SELECT * FROM pg_stat_ann_index_creation;

Vedi un output simile al seguente:

-[ RECORD 1 ]----------+---------------------------------------------------------------------------
relid                         | 271236
indexrelid                    | 271242
schemaname                    | public
relname                       | t1
indexrelname                  | t1_ix1
index_rows_at_creation_time   | 262144

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

Passaggi successivi