Informazioni sul filtro adattivo in AlloyDB AI

Questa pagina fornisce una panoramica concettuale del filtro adattivo in AlloyDB AI, una funzionalità progettata per ottimizzare le ricerche vettoriali filtrate.

Che cos'è il filtraggio adattivo?

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

Lo strumento di ottimizzazione delle query di AlloyDB AI utilizza l'analisi basata sui costi per determinare se il filtro in linea o il pre-filtraggio offrono 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 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 filtraggio

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

Dall'inline al pre-filtraggio

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

Ad esempio, il piano può mostrare Bitmap assisted pre-filtering nel campo Strategia di esecuzione quando l'ottimizzatore determina che il pre-filtraggio è più efficiente in quel punto della query. Questa modifica dinamica si verifica man mano che 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 si utilizza 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 finale di similarità vettoriale.

Dal pre-filtraggio al filtraggio in linea

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

In questi casi, il piano di query viene modificato in modo dinamico per riflettere un'elaborazione più diretta dei dati vettoriali senza un passaggio di pre-filtraggio esplicito precedente alla scansione vettoriale. Questa adattabilità contribuisce a ottenere prestazioni ottimali man mano che 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 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, che la scansione dell'indice bitmap genera 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 interruttore 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 inline.

Puoi osservare questo cambio 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 al di sotto 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 raccogliere quasi l'intero database in un elenco prefiltrato è inefficiente, quindi esegue una scansione vettoriale in linea.

Se esamini il piano di query, noterai 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)

Elevata selettività

A questo punto, modifichi la query per cercare prodotti a meno di 10 $. Quando la query inizia l'esecuzione, lo strumento di ottimizzazione delle query di AlloyDB AI si prepara inizialmente a utilizzare il filtro incorporato. Lo strumento di pianificazione presuppone erroneamente che il filtro non sia molto selettivo. Ciò accade più spesso del previsto perché le statistiche utilizzate per fare 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 raccogliere queste poche righe prima di eseguire la scansione vettoriale è molto più veloce, quindi cambia dinamicamente strategia per il pre-filtraggio.

Il piano di query riflette questo pivot in tempo reale. Il sistema ha scelto di prefiltrare il piccolo set di dati prima di scansionare i 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 (interruttore 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 in ogni query, garantendo prestazioni elevate.

Passaggi successivi