Best practice per l'ottimizzazione degli indici ScaNN

Seleziona una versione della documentazione:

Segui le best practice per ottimizzare gli indici ScaNN e trovare il giusto equilibrio tra richiamo della ricerca e query al secondo (QPS). A seconda del numero di livelli dell'indice, i parametri e i valori consigliati cambiano.

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:

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:

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 50 * K, dove K è il limite impostato nella query.
  4. Se il 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 al 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 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:

  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 compilazione 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 50 * 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 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:

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

    • Bilancia il tempo di compilazione dell'indice e la qualità: imposta max_num_levels su 3 e num_leaves su power(ROWS, 3/4).

    • Ottimizza per la qualità: imposta max_num_levels su 3 e num_leaves su 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. 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.

  4. Se il QPS è troppo basso dopo che le query raggiungono un richiamo target, ricrea l'indice, aumentando il valore di num_leaves e scann.num_leaves_to_search in base alle seguenti indicazioni:

    1. Imposta num_leaves su un fattore maggiore di power(ROWS, 3/4). Ad esempio, se l'indice ha num_leaves impostato su power(ROWS, 3/4), prova a impostarlo sul doppio. Se il valore è già doppio, prova a impostarlo su triplo.

    2. Aumenta scann.num_leaves_to_search in base alle necessità per mantenere il rapporto con num_leaves, che hai annotato nel passaggio 3.

    3. Imposta un valore di num_leaves minore o uguale a ROWS/100.

    4. 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 di scann.num_leaves_to_search senza ricompilare l'indice.

  5. 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.

Passaggi successivi