Ottimizzare il rendimento delle query vettoriali

Questo documento illustra come ottimizzare gli indici per ottenere prestazioni di query più rapide e una migliore capacità di recupero.

Prima di creare un indice ScaNN, completa quanto segue:

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

Sintonizzare un indice ScaNN

Segui le indicazioni riportate di seguito 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 l'ottimizzazione in base al tempo di creazione dell'indice o un indice a due livelli per l'ottimizzazione in base al recupero nella ricerca se il numero di righe del vettore è compreso tra 10 e 100 milioni.

Considera i seguenti esempi di indici ScaNN a due e tre livelli che mostrano come vengono impostati i parametri di ottimizzazione per una tabella con 1000000 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 = [power(1000000, 1/2)]);

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 = [power(1000000, 2/3)], max_num_levels = 2);

Analizza le query

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

  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 analizzate 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 di vettori

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

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;

Per ulteriori informazioni sull'elenco completo delle metriche, consulta Metriche dell'indice vettoriale.

Passaggi successivi