Questa pagina fornisce una panoramica concettuale del filtraggio adattivo in AlloyDB AI, una funzionalità progettata per ottimizzare le ricerche vettoriali filtrate.
Che cos'è il filtraggio adattivo?
Il filtraggio adattivo analizza i pattern di query e le distribuzioni dei dati durante l'esecuzione delle query per scegliere dinamicamente la strategia di filtraggio più efficiente, ad esempio il filtraggio in linea o il pre-filtraggio.
L'ottimizzatore di query di AlloyDB AI utilizza l'analisi basata sui costi per determinare se il filtraggio 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 vettoriali filtrate di AlloyDB AI, in cui il filtraggio adattivo passa automaticamente dall'utilizzo dell'indice vettoriale a quello dei metadati, producendo risultati efficienti e precisi senza intervento manuale.
Passaggio dinamico tra le strategie di filtraggio
Il filtraggio adattivo passa automaticamente e dinamicamente dalle strategie di filtraggio 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 di query di AlloyDB AI utilizza l'analisi basata sui costi per determinare quale strategia offre le prestazioni migliori in un determinato momento.
Dal filtraggio in linea al pre-filtraggio
Quando l'ottimizzatore determina che il pre-filtraggio è più efficiente, il filtraggio adattivo attiva il passaggio dal filtraggio in linea al pre-filtraggio durante l'esecuzione. Il piano di query cambia dinamicamente per riflettere questa modifica.
Ad esempio, il piano può mostrare Bitmap assisted pre-filtering nel campo Execution Strategy (Strategia di esecuzione) 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, una Bitmap Index Scan separata filtra prima un set di dati di grandi dimensioni. Se questo pre-filtraggio riduce efficacemente i candidati, l'indice vettoriale non viene utilizzato per la ricerca di somiglianza vettoriale finale.
Dal pre-filtraggio al filtraggio in linea
Il filtraggio adattivo può anche passare dinamicamente dal pre-filtraggio al filtraggio in linea se l'ottimizzatore di query di AlloyDB AI determina che il filtraggio 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à contribuisce a ottenere prestazioni ottimali quando le distribuzioni dei dati o parametri di ricerca cambiano durante l'esecuzione.
Ad esempio, il piano di query mostra vector scan nel campo Execution Strategy (Strategia di esecuzione) quando l'ottimizzatore determina che una strategia di filtraggio 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 una Bitmap Index Scan sottostante su btree_idx. Ciò indica che la ricerca vettoriale utilizza un filtro bitmap, che la scansione dell'indice bitmap genera in base alla condizione int_col <= 100000000. La Custom Scan (vector scan) elabora quindi solo le righe identificate da questa bitmap, integrando il filtraggio direttamente nel processo di scansione vettoriale.
Esempio: in che modo la selettività attiva un passaggio dinamico
Il filtraggio 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, è probabile che l'ottimizzatore scelga il filtraggio in linea.
Puoi osservare questo passaggio dinamico in tempo reale eseguendo la stessa query e modificando la selettività della clausola WHERE.
Ad esempio, quando esegui una query su una tabella di grandi dimensioni di prodotti al dettaglio, potresti voler eseguire una ricerca vettoriale solo sugli articoli a un prezzo specifico.
Bassa selettività
Innanzitutto, cerchi i prodotti a meno di 1000 $. Poiché quasi tutti i prodotti nel database costano meno di 1000 $, il filtro ha una bassa selettività. L'ottimizzatore di 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 filtraggio 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)
Elevata selettività
Poi, modifichi la query per cercare i prodotti a meno di 10 $. Quando la query inizia l'esecuzione, l'ottimizzatore di query di AlloyDB AI si prepara inizialmente a utilizzare il filtraggio in linea. Il pianificatore presuppone erroneamente che il filtro non sia molto selettivo. Questo accade più spesso del previsto perché le statistiche utilizzate per eseguire 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ù veloce, quindi passa dinamicamente al pre-filtraggio.
Il piano di query riflette questo pivot in tempo reale. Il sistema ha scelto di pre-filtrare il piccolo set di dati prima di eseguire la scansione dei vettori.
Scelta iniziale del pianificatore
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 (passaggio 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 devi 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.