Best practice per l'ottimizzazione degli indici ScaNN in AlloyDB per PostgreSQL

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:

  1. Per creare l'indice ScaNN ottimizzato per i seguenti casi, imposta il parametro num_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.
  2. 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.
  3. Prendi nota del rapporto tra scann.num_leaves_to_search e num_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.
  4. Se il tuo QPS è troppo basso dopo che le query raggiungono un richiamo target, segui questi passaggi:
    1. Ricrea l'indice, aumentando il valore di num_leaves e scann.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 ha num_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 con num_leaves, che hai annotato nel passaggio 3.
      • Imposta num_leaves su un valore minore o uguale al numero di righe diviso per 100.
    2. 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 di scann.num_leaves_to_search senza ricompilare l'indice.
  5. 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:

  1. Crea l'indice ScaNN con le seguenti combinazioni di num_leaves e max_num_levels in base ai tuoi obiettivi di rendimento:

    • bilancia il tempo di creazione dell'indice e la qualità: imposta max_num_levels come 2 e num_leaves come power(rows, ⅔).
    • Ottimizza per la qualità: imposta max_num_levels come 2 e num_leaves come rows/100.
  2. Esegui le query di test. Per saperne di più sull'analisi delle query, consulta Analizzare le query.

  3. Prendi nota del rapporto tra scann.num_leaves_to_search e num_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.

  1. 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 e scann.num_leaves_to_search in base alle seguenti indicazioni:
    • Imposta num_leaves su un fattore maggiore di power(rows, ⅔). Ad esempio, se l'indice ha num_leaves impostato su power(rows, ⅔), prova a impostarlo sul doppio di power(rows, ⅔). Se il valore è già doppio, prova a impostarlo sul triplo di power(rows, ⅔).
    • Aumenta scann.num_leaves_to_search in base alle necessità per mantenere il rapporto con num_leaves, che hai annotato nel passaggio 3.
    • Imposta un valore di num_leaves minore o uguale a rows/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 di scann.num_leaves_to_search senza ricompilare l'indice.
  2. 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.

Passaggi successivi