I parametri consigliati per l'indice ScaNN
variano a seconda
che tu scelga di creare un indice ad albero a due o tre livelli. Questa pagina
fornisce consigli su come ottimizzare i parametri dell'indice AlloyDB per PostgreSQL
per un equilibrio ottimale tra richiamo e QPS.
Creazione dell'indice ScaNN
Per saperne di più, consulta la documentazione di riferimento sull'indice ScaNN.
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
ScaNN
ottimizzato per i seguenti casi, imposta il parametronum_leaves
sul 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_search
enum_leaves
che 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 valore500 * K
, doveK
è 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_leaves
escann.num_leaves_to_search
in base alle seguenti indicazioni:- Imposta
num_leaves
su un fattore maggiore della radice quadrata del numero di righe. Ad esempio, se l'indice hanum_leaves
impostato sulla radice quadrata del conteggio delle righe, prova a impostarlo sul doppio della radice quadrata. Se il valore è già il doppio, prova a impostarlo sul triplo della radice quadrata. - Aumenta
scann.num_leaves_to_search
in base alle necessità per mantenere il rapporto connum_leaves
, che hai annotato nel passaggio 3. - Imposta
num_leaves
su 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_search
senza ricompilare l'indice.
- Ricrea l'indice, aumentando il valore di
- Ripeti il passaggio 4 finché sia il QPS sia 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 di indice num_leaves
e max_num_levels
:
Crea l'indice
ScaNN
con le seguenti combinazioni dinum_leaves
emax_num_levels
in base ai tuoi obiettivi di rendimento:- bilancia il tempo di creazione dell'indice e la qualità: imposta
max_num_levels
come2
enum_leaves
comepower(rows, ⅔)
. - Ottimizza per la qualità: imposta
max_num_levels
come2
enum_leaves
comerows/100
.
- bilancia il tempo di creazione 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_search
enum_leaves
che 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 500 * 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_leaves
escann.num_leaves_to_search
in base alle seguenti indicazioni: - Imposta
num_leaves
su un fattore maggiore dipower(rows, ⅔)
. Ad esempio, se l'indice hanum_leaves
impostato 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_search
in base alle necessità per mantenere il rapporto connum_leaves
, che hai annotato nel passaggio 3. - Imposta un valore di
num_leaves
minore 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_search
senza ricompilare l'indice.
- Ricrea l'indice, aumentando il valore di
Ripeti il passaggio 4 finché sia il QPS sia l'intervallo di richiamo 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 soddisfano le condizioni del filtro.
Per risolvere questo problema, AlloyDB 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 sul rendimento, 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 tua 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 nelle distribuzioni dei vettori o nelle 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.