Per informazioni sulla creazione di indici ScaNN, consulta Creare un indice ScaNN.
Limiti
Prima di iniziare a ottimizzare gli indici ScaNN, prendi nota del seguente limite:
num_leavesè limitato a 30 milioni.
Prima di iniziare
Se vuoi creare un indice ScaNN a quattro livelli, devi prima abilitare la funzionalità di anteprima per l'istanza AlloyDB. Per abilitare la funzionalità di anteprima, scegli uno dei due metodi seguenti:
Abilita il
scann.enable_preview_featuresflag di database.Per saperne di più sulla configurazione dei flag di database, consulta Configurare i flag di database di AlloyDB Omni.
Imposta il flag di database a livello di sessione
scann.max_allowed_num_levelssu3.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:- Tempo di compilazione e qualità dell'indice bilanciati imposta
num_leavessusqrt(rows). - Qualità imposta num_leaves su rows/100.
- Tempo di compilazione e qualità dell'indice bilanciati imposta
- 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 utilizzi vettori ad alta dimensione (500 dimensioni o più) e vuoi migliorare il richiamo, prova a ottimizzare 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 conteggio delle 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à doppio, prova a impostarlo sul triplo della radice quadrata. - Aumenta
scann.num_leaves_to_searchin base alle esigenze per mantenere il rapporto connum_leaves, che hai annotato nel passaggio 3. - Imposta
num_leavessu un valore minore o uguale al conteggio delle righe diviso per 100.
- Imposta
- Esegui di nuovo le query di test.
Durante l'esecuzione delle query di test, prova a ridurre
scann.num_leaves_to_search, trovando un valore che aumenti il QPS mantenendo un richiamo elevato. Prova diversi valori discann.num_leaves_to_searchsenza ricompilare l'indice.
- Ricrea l'indice, aumentando il valore di
- Ripeti il passaggio 4 finché il QPS e l'intervallo di richiamo non raggiungono valori accettabili.
Indice ad albero a tre livelli
Oltre ai consigli per l'indice ScaNN ad albero a due livelli, utilizza le seguenti indicazioni.
Per applicare i consigli per trovare il valore ottimale dei parametri dell'indice num_leaves e max_num_levels, segui questi passaggi:
Crea l'indice
ScaNNcon le seguenti combinazioni dinum_leavesemax_num_levelsin base ai tuoi obiettivi di rendimento:- Bilancia il tempo di compilazione e la qualità dell'indice: imposta
max_num_levelssu2enum_leavessupower(rows, ⅔). - Ottimizza per la qualità: imposta
max_num_levelssu2enum_leavessurows/100.
- Bilancia il tempo di compilazione e la qualità dell'indice: 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 utilizzi vettori ad alta dimensione (500 dimensioni o più) e vuoi migliorare il richiamo, prova a ottimizzare 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 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 esigenze per mantenere il rapporto connum_leaves, che hai annotato nel passaggio 3. - Imposta
num_leavessu un valore minore 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, trovando un valore che aumenti il QPS mantenendo un richiamo elevato. Prova diversi valori discann.num_leaves_to_searchsenza ricompilare l'indice.
- Ricrea l'indice, aumentando il valore di
Ripeti il passaggio 4 finché il QPS e l'intervallo di richiamo non raggiungono valori accettabili.
Indice ad albero a quattro livelli
Oltre ai consigli per
gli indici ad albero a tre livelli, utilizza le seguenti
indicazioni per trovare il valore ottimale di
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 e la qualità dell'indice: imposta
max_num_levelssu3enum_leavessupower(ROWS, 3/4).Ottimizza per la qualità: imposta
max_num_levelssu3enum_leavescomeROWS/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. Utilizza questo rapporto per raggiungere il richiamo target nei passaggi successivi.Se utilizzi vettori ad alta dimensione (500 dimensioni o più) e vuoi migliorare il richiamo, prova a ottimizzare il valore di
scann.pre_reordering_num_neighbors.Se il QPS è troppo basso dopo che le query raggiungono un richiamo target, allora 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 sul triplo.Aumenta
scann.num_leaves_to_searchin base alle esigenze per mantenere il rapporto connum_leaves, che hai annotato nel passaggio 3.Imposta
num_leavessu un valore minore 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 il QPS mantenendo un richiamo elevato. Prova diversi valori discann.num_leaves_to_searchsenza ricompilare l'indice.
Ripeti il passaggio 4 finché l'intervallo di richiamo e il QPS non raggiungono valori accettabili.
Migliorare il richiamo per le ricerche filtrate
Quando esegui una ricerca vettoriale del vicino più prossimo (KNN) che include un filtro, potresti riscontrare situazioni in cui la query restituisce meno risultati di quelli richiesti nella clausola LIMIT. Questo può portare a un richiamo insufficiente ed è più probabile che si verifichi quando utilizzi filtri altamente selettivi. Questo accade perché le partizioni iniziali, o foglie, che ScaNN cerca non contengono un numero sufficiente di vettori che soddisfano le condizioni del filtro.
Per risolvere questo problema, AlloyDB Omni offre una funzionalità che consente alla ricerca di espandersi dinamicamente oltre il set iniziale di foglie per trovare risultati corrispondenti sufficienti.
Come funziona lo streaming
Puoi abilitare la funzionalità di streaming impostando il parametro scann.satisfy_limit su relaxed_order. Quando è abilitata, 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 evitare che una ricerca continui troppo a lungo e per controllare l'impatto sul rendimento, puoi utilizzare il parametro scann.max_pct_leaves_to_search. Questa impostazione funge da salvaguardia impostando un limite superiore alla percentuale di foglie 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 di quelli previsti in base alla clausola
LIMIT.
Abilitando scann.satisfy_limit, puoi migliorare il richiamo delle ricerche filtrate. Ti consigliamo inoltre di configurare scann.max_pct_leaves_to_search per raggiungere un equilibrio tra richiamo e rendimento delle query.
Manutenzione indici
Se la tabella è soggetta a aggiornamenti o inserimenti frequenti, ti consigliamo di ricompilare periodicamente l'indice ScaNN esistente per migliorare l'accuratezza del richiamo.
Puoi monitorare le metriche dell'indice per visualizzare le modifiche nelle distribuzioni vettoriali o le mutazioni vettoriali dalla creazione dell'indice e quindi ricompilare l'indice di conseguenza. Per saperne di più sulle metriche, consulta Visualizzare le metriche dell'indice vettoriale.