Per informazioni sulla creazione di indici ScaNN, vedi Creare un indice ScaNN.
Limiti
Prima di iniziare a ottimizzare gli indici ScaNN, tieni presente il seguente limite:
num_leavesè limitato a 30 milioni.
Prima di iniziare
Se vuoi creare un indice ScaNN a quattro livelli, devi prima attivare la funzionalità Anteprima per l'istanza AlloyDB. Per attivare la funzionalità Anteprima, scegli uno dei seguenti due metodi:
Attiva il flag di database
scann.enable_preview_features.Per saperne di più sulla configurazione dei flag di database, consulta Configura i flag di database AlloyDB Omni.
Imposta il flag del database
scann.max_allowed_num_levelsa livello di sessione su3.SET scann.max_allowed_num_levels = 3;
Indice ad albero a due livelli
Per applicare i consigli che ti aiutano a trovare i valori ottimali di num_leaves e
num_leaves_to_search per il tuo set di dati, segui questi passaggi consigliati:
- Per creare l'indice
ScaNNottimizzato per i seguenti casi, imposta il parametronum_leavessul seguente valore, dove rows è il numero di righe nella tabella indicizzata:- balanced index build time and quality impostato su
num_leaves.sqrt(rows) - quality imposta num_leaves su righe/100.
- balanced index build time and quality impostato su
- Esegui le query di test, aumentando il valore di
scann.num_of_leaves_to_search, finché non raggiungi l'intervallo di richiamo target, ad esempio il 95%. Per saperne di più sull'analisi delle query, consulta Analizzare le query. - Prendi nota del rapporto tra
scann.num_leaves_to_searchenum_leavesche verrà utilizzato nei passaggi successivi. Questo rapporto fornisce un'approssimazione del set di dati che ti aiuterà a raggiungere il richiamo target.
Se lavori con vettori di dimensioni elevate (500 dimensioni o più) e vuoi migliorare il richiamo, prova a modificare il valore discann.pre_reordering_num_neighbors. Il valore predefinito è impostato sul valore50 * K, doveKè il limite impostato nella query. - Se il QPS è troppo basso dopo che le query raggiungono un richiamo target, segui questi passaggi:
- Ricrea l'indice, aumentando il valore di
num_leavesescann.num_leaves_to_searchin base alle seguenti indicazioni:- Imposta
num_leavessu un fattore maggiore della radice quadrata del numero di righe. Ad esempio, se l'indice hanum_leavesimpostato sulla radice quadrata del conteggio delle righe, prova a impostarlo sul doppio della radice quadrata. Se il valore è già il doppio, prova a impostarlo al triplo della radice quadrata. - Aumenta
scann.num_leaves_to_searchin base alle necessità per mantenere il rapporto connum_leaves, che hai annotato nel passaggio 3. - Imposta
num_leavessu un valore minore o uguale al numero di righe diviso per 100.
- Imposta
- Esegui di nuovo le query di test.
Mentre esegui le query di test, prova a ridurre
scann.num_leaves_to_search, trovando un valore che aumenti le QPS mantenendo un richiamo elevato. Prova valori diversi discann.num_leaves_to_searchsenza ricompilare l'indice.
- Ricrea l'indice, aumentando il valore di
- Ripeti il passaggio 4 finché sia il QPS sia l'intervallo di richiamo non avranno raggiunto valori accettabili.
Indice ad albero a tre livelli
Oltre ai consigli per l'indice dell'albero a due livelli ScaNN, utilizza le seguenti indicazioni.
Per applicare i consigli per trovare il valore ottimale dei parametri di indice num_leaves e max_num_levels:
Crea l'indice
ScaNNcon le seguenti combinazioni dinum_leavesemax_num_levelsin base ai tuoi obiettivi di rendimento:- bilancia il tempo di compilazione dell'indice e la qualità: imposta
max_num_levelscome2enum_leavescomepower(rows, ⅔). - Ottimizza per la qualità: imposta
max_num_levelscome2enum_leavescomerows/100.
- bilancia il tempo di compilazione dell'indice e la qualità: imposta
Esegui le query di test. Per saperne di più sull'analisi delle query, consulta Analizzare le query.
Prendi nota del rapporto tra
scann.num_leaves_to_searchenum_leavesche verrà utilizzato nei passaggi successivi. Questo rapporto fornisce un'approssimazione del set di dati che ti aiuterà a raggiungere il richiamo target.
Se lavori con vettori di dimensioni elevate (500 dimensioni o più) e vuoi migliorare il richiamo, prova a modificare il valore di scann.pre_reordering_num_neighbors. Il valore predefinito è impostato sul valore 50 * K, dove K è il limite impostato nella query.
Se il tuo QPS è troppo basso dopo che le query raggiungono un richiamo target, segui questi passaggi:
- Ricrea l'indice, aumentando il valore di
num_leavesescann.num_leaves_to_searchin base alle seguenti indicazioni: - Imposta
num_leavessu un fattore maggiore dipower(rows, ⅔). Ad esempio, se l'indice hanum_leavesimpostato supower(rows, ⅔), prova a impostarlo sul doppio dipower(rows, ⅔). Se il valore è già doppio, prova a impostarlo sul triplo dipower(rows, ⅔). - Aumenta
scann.num_leaves_to_searchin base alle necessità per mantenere il rapporto connum_leaves, che hai annotato nel passaggio 3. - Imposta un valore di
num_leavesminore o uguale arows/100. - Esegui di nuovo le query di test. Mentre esegui le query di test, prova a ridurre
scann.num_leaves_to_search, trovando un valore che aumenti le QPS mantenendo un richiamo elevato. Prova valori diversi discann.num_leaves_to_searchsenza ricompilare l'indice.
- Ricrea l'indice, aumentando il valore di
Ripeti il passaggio 4 finché sia il QPS sia l'intervallo di richiamo non avranno raggiunto valori accettabili.
Indice ad albero a quattro livelli
Oltre ai suggerimenti per gli
indici ad albero a tre livelli, utilizza le seguenti
indicazioni per trovare il valore ottimale per
num_leaves e
max_num_levels:
Crea un indice ScaNN con le seguenti combinazioni di
num_leavesemax_num_levelsin base ai tuoi obiettivi di rendimento:Bilancia il tempo di compilazione dell'indice e la qualità: imposta
max_num_levelssu3enum_leavessupower(ROWS, 3/4).Ottimizza per la qualità: imposta
max_num_levelssu3enum_leavessuROWS/100.
Esegui le query di test. Per saperne di più sull'analisi delle query, consulta Analizzare le query.
Prendi nota del rapporto tra
scann.num_leaves_to_searchenum_leaves. Utilizzi questo rapporto per raggiungere il richiamo target nei passaggi successivi.Se lavori con vettori di dimensioni elevate (500 dimensioni o più) e vuoi migliorare il richiamo, prova a modificare il valore di
scann.pre_reordering_num_neighbors.Se il QPS è troppo basso dopo che le query raggiungono un richiamo target, ricrea l'indice, aumentando il valore di
num_leavesescann.num_leaves_to_searchin base alle seguenti indicazioni:Imposta
num_leavessu un fattore maggiore dipower(ROWS, 3/4). Ad esempio, se l'indice hanum_leavesimpostato supower(ROWS, 3/4), prova a impostarlo sul doppio. Se il valore è già doppio, prova a impostarlo su triplo.Aumenta
scann.num_leaves_to_searchin base alle necessità per mantenere il rapporto connum_leaves, che hai annotato nel passaggio 3.Imposta un valore di
num_leavesminore o uguale aROWS/100.Esegui di nuovo le query di test. Durante l'esecuzione delle query di test, prova a ridurre
scann.num_leaves_to_search. Trova un valore che aumenti le QPS mantenendo un richiamo elevato. Prova valori diversi discann.num_leaves_to_searchsenza ricompilare l'indice.
Ripeti il passaggio 4 finché l'intervallo di richiamo e le QPS non raggiungono valori accettabili.
Migliorare il richiamo per le ricerche filtrate
Quando esegui una ricerca vettoriale k-nearest neighbor (KNN) che include un filtro, potresti riscontrare situazioni in cui la query restituisce meno risultati di quelli richiesti nella clausola LIMIT. Ciò può portare a quella che è nota come copertura insufficiente ed è più probabile che si verifichi quando si utilizzano filtri altamente selettivi. Ciò accade perché le partizioni iniziali, o foglie, in cui ScaNN esegue la ricerca non contengono un numero sufficiente di vettori che soddisfino le condizioni del filtro.
Per risolvere questo problema, AlloyDB Omni offre una funzionalità che consente alla ricerca di espandersi dinamicamente oltre l'insieme iniziale di foglie per trovare un numero sufficiente di risultati corrispondenti.
Come funziona lo streaming
Puoi abilitare la funzionalità di streaming impostando il parametro scann.satisfy_limit su relaxed_order. Se attivata, la scansione vettoriale continua a cercare in altre partizioni foglia finché non trova risultati sufficienti a soddisfare il LIMIT della query, migliorando così il richiamo.
Per impedire che una ricerca continui troppo a lungo e per controllare l'impatto sulle prestazioni, puoi utilizzare il parametro scann.max_pct_leaves_to_search. Questa impostazione funge da salvaguardia impostando un limite superiore alla percentuale di nodi foglia totali che una query può visitare. Il valore predefinito è 15%.
Quando utilizzare lo streaming
Valuta la possibilità di utilizzare la funzionalità di streaming quando:
- Utilizzi i filtri con le ricerche vettoriali.
- Noti che le query restituiscono meno risultati del previsto in base alla clausola
LIMIT.
Se attivi scann.satisfy_limit, puoi migliorare il richiamo delle ricerche filtrate. Ti consigliamo di configurare anche scann.max_pct_leaves_to_search per raggiungere un equilibrio tra richiamo e prestazioni delle query.
Manutenzione indici
Se la tabella è soggetta a aggiornamenti o inserimenti frequenti, ti consigliamo di reindicizzare periodicamente l'indice ScaNN esistente per migliorare l'accuratezza del recupero.
Puoi monitorare le metriche dell'indice per visualizzare le modifiche alle distribuzioni dei vettori o alle mutazioni dei vettori dalla creazione dell'indice e poi eseguire nuovamente l'indicizzazione di conseguenza. Per saperne di più sulle metriche, consulta Visualizzare le metriche dell'indice vettoriale.