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).
Ottimizzare le opzioni di ricerca vettoriale
Se non specifichi alcuna opzione di indice vettoriale, Spanner tenta di scegliere automaticamente le opzioni ottimizzate. Gli utenti esperti che vogliono ottimizzare le
opzioni di indice vettoriale per il loro carico di lavoro specifico possono impostare e ottimizzare questi
valori creando un nuovo indice vettoriale e impostando le
index_option_list
nell'istruzione CREATE VECTOR INDEX. I valori più ottimali per le opzioni di 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 valoretree_depthdi2. In caso contrario, un valoretree_depthdi3supporta tabelle con un massimo di circa 10 miliardi di righe. Se non specificato, Spanner determina automaticamente il valore ditree_depth.num_leaves: consigliamo di scegliere come target 200-1000 righe per foglia. Un valore maggiore dinum_leavesaumenta il tempo di compilazione dell'indice vettoriale, ma può ridurre il costo della query per un determinato richiamo target. Tuttavia, valori eccessivamente grandi dinum_leavespossono causare un aumento del costo della query a causa dei costi generali associati alla ricerca di molti cluster di foglie molto piccoli. Se non specificato, Spanner determina automaticamente il valore dinum_leaves.num_branches: questa opzione è applicabile solo quandotree_depthè 3. Consigliamo di scegliere come target 50-500 foglie per ramo enum_branchesdeve essere inferiore anum_leaves. Un valore maggiore dinum_branchesaumenta il tempo di compilazione dell'indice vettoriale, ma può ridurre il costo della query per un determinato richiamo target. Tuttavia, valori eccessivamente grandi dinum_branchespossono causare un aumento del costo della query a causa dei costi generali associati alla ricerca di molti cluster di foglie molto piccoli. Se non specificato, Spanner determina automaticamente il valore dinum_branches.num_leaves_to_search: questa opzione specifica il numero di nodi foglia dell'indice da cercare. L'aumento dinum_leaves_to_searchmigliora 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'istruzioneCREATE VECTOR INDEXcome valore dinum_leaves_to_search. Se utilizzi una clausola di filtro, aumenta questo valore per ampliare la ricerca.
Se si ottiene un richiamo accettabile, ma il costo delle query è troppo elevato, con conseguente QPS massima bassa, prova ad aumentare num_leaves seguendo questi passaggi:
- Imposta
num_leavessu un multiplokdel suo valore originale (ad esempio,2 * (table_row_count / 1000)). - Imposta
num_leaves_to_searchsullo stesso multiplo k del suo valore originale. - Prova a ridurre
num_leaves_to_searchper migliorare il costo e il 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 visualizzazione INFORMATION_SCHEMA.INDEX_OPTIONS. I valori dei parametri potrebbero differire leggermente da quelli specificati esplicitamente durante la creazione dell'indice perché a volte Spanner li adatta per adattarli 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 ottimizzare il valore num_leaves_to_search o di ricreare l'indice vettoriale.
Aumentare il valore num_leaves_to_search
Se il valore 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 richiamo cercando più foglie. Le query recenti potrebbero contenere più di questi vettori difficili.
Ricreare 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à:
- 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 ha un rendimento migliore. In questo caso, procedi al passaggio successivo. In caso contrario, procedi all'eliminazione dell'indice vettoriale obsoleto. 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_INDEXper 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 riottimizzarenum_leaves_to_searchnella nuova query.b. Modifica lo schema: puoi impostare l'opzione
disable_searchsu uno dei tuoi indici vettoriali. Se impostata sutrue, Spanner disabilita l'indice vettoriale. Puoi farlo eseguendo l'istruzione di modifica dello schemaALTER 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_INDEXper specificare un indice vettoriale con l'opzionedisable_searchimpostata sutrue, la query non riesce.Elimina l'indice vettoriale obsoleto.
Passaggi successivi
Scopri di più sugli indici vettoriali di Spanner .
Scopri di più sui vicini più vicini approssimativi di Spanner .
Scopri di più sulle funzioni GoogleSQL
APPROXIMATE_COSINE_DISTANCE(),APPROXIMATE_EUCLIDEAN_DISTANCE(),APPROXIMATE_DOT_PRODUCT().Scopri di più sulle istruzioni GoogleSQL
VECTOR INDEX.