Best practice per l'indicizzazione vettoriale

Questa pagina descrive le best practice per l'indicizzazione vettoriale che ottimizzano i vostri indici vettoriali e migliorano i risultati delle query di ricerca approssimativa del vicino prossimo (ANN).

Ottimizza le opzioni di ricerca vettoriale

I valori più ottimali per le opzioni dell'indice vettoriale dipendono dal caso d'uso, dal set di dati vettoriali e dai vettori di query. Puoi impostare e ottimizzare questi valori creando un nuovo indice vettoriale e impostando index_option_list nell'istruzione CREATE VECTOR INDEX. Potresti dover eseguire un'ottimizzazione iterativa per trovare i valori migliori per il tuo carico di lavoro specifico.

Ecco alcune linee guida utili da seguire quando scegli i valori appropriati:

  • tree_depth (livello dell'albero): se la tabella che stai indicizzando ha meno di 10 milioni di righe, utilizza un valore tree_depth di 2. In caso contrario, un valore tree_depth di 3 supporta tabelle con un massimo di circa 10 miliardi di righe.

  • num_leaves: utilizza la radice quadrata del numero di righe nel set di dati. Un valore più grande può aumentare il tempo di compilazione dell'indice vettoriale. Evita di impostare num_leaves su un valore maggiore di table_row_count diviso per 1000, perché in questo modo le foglie diventano troppo piccole e le prestazioni sono scarse.

  • num_leaves_to_search: questa opzione specifica il numero di nodi foglia dell'indice da cercare. L'aumento di num_leaves_to_search migliora il richiamo, ma aumenta anche la latenza e il costo. Ti consigliamo di utilizzare un numero pari all'1% del numero totale di foglie definite nell'istruzione CREATE VECTOR INDEX come valore per num_leaves_to_search. Se utilizzi una clausola di filtro, aumenta questo valore per ampliare la ricerca.

Se il richiamo accettabile viene raggiunto, ma il costo delle query è troppo elevato, con conseguente QPS massima bassa, prova ad aumentare num_leaves seguendo questi passaggi:

  1. Imposta num_leaves su un multiplo k del suo valore originale (ad esempio, 2 * sqrt(table_row_count)).
  2. Imposta num_leaves_to_search sullo stesso multiplo k del suo valore originale.
  3. Prova a ridurre num_leaves_to_search per migliorare il costo e il QPS mantenendo il richiamo.

Migliora il richiamo

Per migliorare il richiamo, valuta la possibilità di ottimizzare il valore num_leaves_to_search o di ricreare l'indice vettoriale.

Se il valore num_leaves_to_search è troppo piccolo, potrebbe essere più difficile trovare i vicini più prossimi per alcuni vettori di query. La creazione di un nuovo indice vettoriale con un valore num_leaves_to_search aumentato può contribuire a migliorare il richiamo cercando più foglie. Le query recenti potrebbero contenere più di questi vettori difficili.

Ricrea l'indice vettoriale

La struttura ad albero dell'indice vettoriale è ottimizzata per il set di dati al momento della creazione e rimane statica in seguito. Pertanto, se vengono aggiunti vettori significativamente diversi dopo la creazione dell'indice vettoriale iniziale, la struttura ad albero potrebbe non essere ottimale, con conseguente richiamo inferiore.

Per ricreare l'indice vettoriale senza tempi di inattività:

  1. Crea un nuovo indice vettoriale sulla stessa colonna di embedding dell'indice vettoriale corrente, aggiornando i parametri (ad esempio, OPTIONS) in base alle esigenze. Al termine della creazione dell'indice, puoi valutare quale dei due indici funziona meglio. In questo caso, procedi al passaggio successivo. In caso contrario, procedi all'eliminazione dell'indice vettoriale obsoleto.
  2. Spanner decide automaticamente quale indice utilizzare nell'esecuzione della query. Spanner offre due modi per specificare l'indice da utilizzare. Scegli uno dei seguenti metodi per valutare e confrontare gli indici:

    a. Modifica l'applicazione: puoi aggiornare un sottoinsieme delle query in modo che utilizzino l'hint FORCE_INDEX per puntare al nuovo indice per aggiornare la query di ricerca vettoriale. In questo modo, la query utilizza il nuovo indice vettoriale. Con questo metodo, potresti dover riottimizzare num_leaves_to_search nella nuova query.

    b. Modifica lo schema: puoi impostare l'opzione disable_search su uno dei tuoi indici vettoriali. Se impostata su true, Spanner disabilita l'indice vettoriale. Puoi farlo eseguendo l'istruzione di modifica dello schema ALTER VECTOR INDEX:

      ALTER VECTOR INDEX IncidentVectorIndex SET OPTIONS (disable_search=true);
    

    Questo metodo impedisce a Spanner di utilizzare questo indice vettoriale nel database. Se hai due indici e imposti questa opzione sull'indice precedente, tutte le query utilizzano il nuovo indice dopo l'applicazione della modifica dello schema. Se utilizzi l'hint FORCE_INDEX per specificare un indice vettoriale con l'opzione disable_search impostata su true, la query non riesce.

  3. Elimina l'indice vettoriale obsoleto.

Passaggi successivi