Informazioni sul filtro adattivo in AlloyDB AI

Il filtro adattivo in AlloyDB AI ottimizza le ricerche Vector Search filtrate selezionando dinamicamente la strategia di filtro più efficiente durante l'esecuzione delle query. Comprendere in che modo l'ottimizzatore delle query passa dal filtro in linea al pre-filtraggio ti aiuta a progettare query vettoriali ad alte prestazioni senza ottimizzazione manuale dell'indice.

Che cos'è il filtro adattivo?

Il filtro adattivo analizza i pattern di query e le distribuzioni dei dati durante l'esecuzione delle query per scegliere in modo dinamico la strategia di filtro più efficiente, ad esempio il filtro in linea o il pre-filtraggio.

L'ottimizzatore delle query di AlloyDB AI utilizza l'analisi basata sui costi per determinare se il filtro in linea o il pre-filtraggio offre le prestazioni migliori in un determinato momento durante l'esecuzione della query.

Questo tipo di ottimizzazione supporta le ricerche Vector Search filtrate in AlloyDB AI, dove il filtro adattivo passa automaticamente dall'utilizzo dell'indice vettoriale a quello dei metadati, producendo risultati efficienti e accurati senza intervento manuale.

Passaggio dinamico tra le strategie di filtro

Il filtro adattivo passa automaticamente e dinamicamente dalle strategie di filtro in linea a quelle di pre-filtraggio durante l'esecuzione delle query in base ai pattern di query e alle distribuzioni dei dati in tempo reale. L'ottimizzatore delle query di AlloyDB AI utilizza l'analisi basata sui costi per determinare quale strategia offre le prestazioni migliori in un determinato momento.

Dal filtraggio inline al pre-filtraggio

Quando l'ottimizzatore determina che il pre-filtraggio è più efficiente, il filtro adattivo attiva un passaggio dal filtro in linea al pre-filtraggio durante l'esecuzione. Il piano di query cambia dinamicamente per riflettere questa situazione.

Ad esempio, il piano può mostrare Bitmap assisted pre-filtering nel campo Execution Strategy quando l'ottimizzatore determina che il pre-filtraggio è più efficiente in quel punto della query. Questa modifica dinamica si verifica quando il sistema si adatta ai dati effettivi che incontra durante l'esecuzione della query.

Limit (actual rows=10 loops=1)
  ->  Custom Scan (vector scan) on t1 (actual rows=10 loops=1)
        Execution Strategy: Bitmap assisted pre-filtering
        Order By: (vec_col <=> '[...]'::vector)
        Limit: 10
        ->  Bitmap Index Scan on btree_idx (actual rows=10000 loops=1)
              Index Cond: (int_col <= 100000000)

Quando utilizzi Execution Strategy: Bitmap assisted pre-filtering, un Bitmap Index Scan separato filtra prima un set di dati di grandi dimensioni. Se questo pre-filtraggio restringe efficacemente i candidati, l'indice vettoriale non viene utilizzato per la ricerca di somiglianza vettoriale finale.

Dal pre-filtraggio al filtraggio in linea

Il filtro adattivo può anche passare dinamicamente dal pre-filtraggio al filtro in linea se l'ottimizzatore delle query di AlloyDB AI determina che il filtro in linea è più efficiente per le caratteristiche della query corrente.

In questi casi, il piano di query si adatta dinamicamente per riflettere un'elaborazione più diretta dei dati vettoriali senza un passaggio di pre-filtraggio esplicito che precede la scansione vettoriale. Questa adattabilità consente di ottenere prestazioni ottimali man mano che le distribuzioni dei dati o parametri di ricerca cambiano durante il runtime.

Ad esempio, il piano di query mostra vector scan nel campo Strategia di esecuzione quando l'ottimizzatore determina che una strategia di filtro in linea è più efficiente per la query specificata.

Limit (actual rows=10 loops=1)
  ->  Custom Scan (vector scan) on t1 (actual rows=10 loops=1)
        Execution Strategy: Bitmap assisted vector Scan on scann_idx
        Order By: (vec_col <=> '[...]'::vector)
        Limit: 10
        Num Requalifications: 0
        Num filtered: 1000
        ->  Bitmap Index Scan on btree_idx (actual rows=10000 loops=1)
              Index Cond: (int_col <= 100000000)

In questo esempio, Execution Strategy mostra Bitmap assisted vector Scan on scann_idx, con un Bitmap Index Scan sottostante su btree_idx. Ciò indica che la ricerca vettoriale utilizza un filtro bitmap, generato dalla scansione dell'indice bitmap in base alla condizione int_col <= 100000000. Custom Scan (vector scan) elabora quindi solo le righe identificate da questa bitmap, integrando il filtro direttamente nel processo di scansione vettoriale.

Esempio: in che modo la selettività attiva un passaggio dinamico

Il filtro adattivo basa le sue decisioni sulla selettività dei filtri standard. Se un filtro elimina una grande quantità di dati, è probabile che l'ottimizzatore scelga il pre-filtraggio. Se il filtro lascia intatta la maggior parte dei dati, l'ottimizzatore probabilmente sceglie il filtro in linea.

Puoi osservare questo passaggio dinamico in tempo reale eseguendo la stessa query e regolando la selettività della clausola WHERE.

Ad esempio, quando esegui una query su una tabella di grandi dimensioni di prodotti di vendita al dettaglio, potresti voler eseguire una ricerca vettoriale solo sugli articoli con un prezzo specifico.

Bassa selettività

Innanzitutto, cerchi prodotti con un prezzo inferiore a 1000 $. Poiché quasi tutti i prodotti nel database costano meno di 1000 $, il filtro ha una selettività bassa. L'ottimizzatore delle query di AlloyDB AI determina che la raccolta di quasi l'intero database in un elenco pre-filtrato è inefficiente, quindi esegue una scansione vettoriale in linea.

Se esamini il piano di query, vedrai che il sistema si è adattato dinamicamente al set di dati di grandi dimensioni e ha scelto il filtro in linea.

  Limit (actual rows=10)
    -> Custom Scan (vector scan)
    Execution Strategy: Bitmap assisted vector Scan on scann_idx
    Order By: (vec <=> '[...]'::vector)
    -> Bitmap Index Scan
       Index Cond: (price <= 1000)

Selettività elevata

Successivamente, modifichi la query per cercare prodotti con un prezzo inferiore a 10 $. All'inizio dell'esecuzione della query, l'ottimizzatore delle query di AlloyDB AI si prepara inizialmente a utilizzare il filtro in linea. Il planner presuppone erroneamente che il filtro non sia molto selettivo. Questo accade più spesso del previsto perché le statistiche utilizzate per effettuare queste stime non sono sempre accurate o aggiornate. Tuttavia, determina rapidamente che il filtro del prezzo ha un'elevata selettività: pochissimi articoli nel database hanno un prezzo così basso. L'ottimizzatore determina che la raccolta di queste poche righe prima di eseguire la scansione vettoriale è molto più rapida, quindi cambia dinamicamente le strategie passando al pre-filtraggio.

Il piano di query riflette questa rotazione in tempo reale. Il sistema ha scelto di eseguire il pre-filtraggio del set di dati di piccole dimensioni prima di scansionare i vettori.

Scelta iniziale dello Strumento di pianificazione

Limit (actual rows=10)
  -> Custom Scan (vector scan)
     Execution Strategy: Bitmap assisted vector Scan on scann_idx
     Order By: (vec <=> '[...]'::vector)
     -> Bitmap Index Scan
        Index Cond: (price <= 10)

Esecuzione effettiva (switch adattivo)

Limit (actual rows=10)
  -> Custom Scan (vector scan)
     Execution Strategy: Bitmap assisted pre-filtering
     Order By: (vec <=> '[...]'::vector)
     -> Bitmap Index Scan
        Index Cond: (price <= 10)

Non è necessario riscrivere il codice dell'applicazione o aggiornare manualmente gli indici del database man mano che la distribuzione dei dati cambia nel tempo. AlloyDB AI gestisce la logica di routing per te su ogni query, garantendo prestazioni elevate.

Passaggi successivi