Best practice per l'indicizzazione vettoriale

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

Ottimizza le opzioni di ricerca vettoriale

Se non specifichi alcuna opzione di indice vettoriale, Spanner tenta di scegliere automaticamente le opzioni ottimizzate. Per gli utenti avanzati che vogliono ottimizzare le opzioni dell'indice vettoriale per il proprio workload specifico, puoi impostare e ottimizzare questi valori creando un nuovo indice vettoriale e impostando index_option_list nell'istruzione CREATE VECTOR INDEX. 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. 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 tree_depth di 2. In caso contrario, un tree_depth di 3 supporta tabelle con un massimo di circa 10 miliardi di righe. Se non specificato, Spanner determinerà automaticamente il valore di tree_depth.

  • num_leaves: ti consigliamo di scegliere come target 200-1000 righe per foglia. Un valore maggiore di num_leaves aumenta il tempo di compilazione dell'indice vettoriale, ma può ridurre il costo della query per un determinato richiamo target. Tuttavia, valori eccessivamente grandi di num_leaves possono causare un nuovo aumento del costo delle query a causa dei costi generali associati alla ricerca di molti cluster foglia molto piccoli. Se non specificato, Spanner determina automaticamente il valore di num_leaves.

  • num_branches: questa opzione è applicabile solo quando tree_depth è 3. Ti consigliamo di scegliere come target 50-500 foglie per ramo e num_branches deve essere inferiore a num_leaves. Un valore maggiore di num_branches aumenta il tempo di compilazione dell'indice vettoriale, ma può ridurre il costo della query per un determinato richiamo target. Tuttavia, valori eccessivamente grandi di num_branches possono causare un nuovo aumento del costo delle query a causa dei costi generali associati alla ricerca di molti cluster foglia molto piccoli. Se non specificato, Spanner determina automaticamente il valore di num_branches.

  • 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 definito 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 viene raggiunto un richiamo accettabile, ma il costo delle query è troppo elevato, con conseguente basso QPS massimo, prova ad aumentare num_leaves seguendo questi passaggi:

  1. Imposta num_leaves su un multiplo k del suo valore originale (ad esempio, 2 * (table_row_count / 1000)).
  2. Imposta num_leaves_to_search in modo che sia lo stesso multiplo k del suo valore originale.
  3. Prova a ridurre num_leaves_to_search per migliorare il costo e le QPS mantenendo il richiamo.

Determinare i valori delle opzioni di ricerca vettoriale

Per determinare i parametri tree_depth, num_leaves e num_branches che Spanner utilizza per l'indice vettoriale, esegui una query sulla vista INFORMATION_SCHEMA.INDEX_OPTIONS. I valori dei parametri potrebbero differire leggermente da quelli specificati esplicitamente durante la creazione dell'indice perché Spanner a volte li adatta per adattarsi meglio ai tuoi dati. Se non hai specificato questi parametri, la visualizzazione INFORMATION_SCHEMA.INDEX_OPTIONS mostra i valori scelti da Spanner.

Esegui questa query per visualizzare i valori dei parametri:

SELECT
  opt.option_name,
  opt.option_type,
  opt.option_value
FROM
  INFORMATION_SCHEMA.INDEX_OPTIONS AS opt
WHERE
  opt.index_name = @vector_index_name;

La query restituisce righe che includono option_name: system_optimized_tree_depth, system_optimized_num_leaves e system_optimized_num_branches, che riflettono i parametri utilizzati dall'indice.

Migliorare il richiamo

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

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

Ricrea l'indice vettoriale

La struttura ad albero dell'indice vettoriale viene 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 peggiore.

Per aggiornare l'indice vettoriale senza tempi di inattività, scegli una delle seguenti opzioni:

  • Opzione 1: reindicizzazione sul posto con le stesse opzioni (utilizzando DDL)

    Se vuoi eseguire una reindicizzazione sul posto dell'indice vettoriale con le stesse opzioni di indice, puoi eseguire la seguente istruzione DDL a seconda del dialetto del database. La reindicizzazione viene eseguita in background e consente di continuare le operazioni di lettura e scrittura sull'indice.

    GoogleSQL

    ALTER VECTOR INDEX IncidentVectorIndex REBUILD;
    

    PostgreSQL

    REINDEX INDEX CONCURRENTLY incidentvectorindex;
    
  • Opzione 2: esegui nuovamente l'indicizzazione manualmente con opzioni modificate

    Se devi modificare le opzioni di indice (ad esempio num_leaves, tree_depth, ecc.), completa i seguenti passaggi:

    1. Crea un nuovo indice vettoriale nella stessa colonna di incorporamento dell'indice vettoriale corrente, aggiornando i parametri (ad esempio OPTIONS) in modo appropriato. Una volta completata la creazione dell'indice, valuta quale indice ha un rendimento migliore.
    2. Spanner decide automaticamente quale indice utilizzare nell'esecuzione della query. Scegli uno dei seguenti metodi per valutare e confrontare gli indici:

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

      b. Modifica dello schema: puoi impostare l'opzione disable_search su uno dei tuoi indici vettoriali. Se impostato su true, Spanner disattiva 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 tuo database. Se hai due indici e imposti questa opzione su quello meno recente, tutte le query utilizzano il nuovo indice dopo l'applicazione della modifica dello schema. Se utilizzi il suggerimento FORCE_INDEX per specificare un indice vettoriale con l'opzione disable_search impostata su true, la query non va a buon fine.

    3. Elimina l'indice vettoriale obsoleto.

Passaggi successivi