Adaptives Filtern in AlloyDB AI

Auf dieser Seite finden Sie eine konzeptionelle Übersicht über die adaptive Filterung in AlloyDB AI, einer Funktion zur Optimierung gefilterter Vektorsuchen.

Was ist adaptive Filterung?

Beim adaptiven Filtern werden Abfragemuster und Datenverteilungen während der Abfrageausführung analysiert, um dynamisch die effizienteste Filterstrategie auszuwählen, z. B. Inline- oder Vorfilterung.

Der AlloyDB AI-Abfrageoptimierer verwendet eine kostenbasierte Analyse, um zu ermitteln, ob Inline-Filterung oder Vorabfilterung zu einem bestimmten Zeitpunkt während der Abfrageausführung die beste Leistung bietet.

Diese Art der Optimierung unterstützt die gefilterten Vektorsuchen von AlloyDB AI, da das adaptive Filtern automatisch zwischen der Verwendung von Vektor- und Metadatenindex wechselt, um effiziente und genaue Ergebnisse ohne manuellen Eingriff zu erzielen.

Dynamisches Wechseln zwischen Filterstrategien

Beim adaptiven Filtern wird während der Abfrageausführung automatisch und dynamisch zwischen Inline-Filterung und Vorabfilterung gewechselt, basierend auf Abfragemustern und Datenverteilungen in Echtzeit. Der AlloyDB AI-Abfrageoptimierer verwendet eine kostenbasierte Analyse, um zu ermitteln, welche Strategie zu einem bestimmten Zeitpunkt die beste Leistung bietet.

Von Inline- zu Vorabfilterung

Wenn der Optimierer feststellt, dass die Vorabfilterung effizienter ist, löst die adaptive Filterung während der Ausführung einen Wechsel von der Inline- zur Vorabfilterung aus. Der Abfrageplan ändert sich dynamisch, um dies widerzuspiegeln.

Im Plan kann beispielsweise im Feld Ausführungsstrategie Bitmap assisted pre-filtering angezeigt werden, wenn der Optimierer feststellt, dass die Vorabfilterung an dieser Stelle in der Abfrage effizienter ist. Diese dynamische Änderung erfolgt, wenn das System sich an die tatsächlichen Daten anpasst, die während der Ausführung der Abfrage auftreten.

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)

Bei Verwendung von Execution Strategy: Bitmap assisted pre-filtering wird zuerst ein großes Dataset mit einem separaten Bitmap Index Scan gefiltert. Wenn durch diese Vorabfilterung die Kandidaten effektiv eingeschränkt werden, wird der Vektorindex nicht für die endgültige Vektorähnlichkeitssuche verwendet.

Von Vorab- zu Inline-Filterung

Beim adaptiven Filtern kann auch dynamisch von der Vorab- zur Inline-Filterung gewechselt werden, wenn der AlloyDB AI-Abfrageoptimierer feststellt, dass die Inline-Filterung für die aktuellen Abfrageeigenschaften effizienter ist.

In solchen Fällen wird der Abfrageplan dynamisch angepasst, um eine direktere Verarbeitung der Vektordaten widerzuspiegeln, ohne dass vor dem Vektorscan ein expliziter Vorfilterungsschritt erfolgt. Diese Anpassungsfähigkeit trägt dazu bei, eine optimale Leistung zu erzielen, wenn sich Datenverteilungen oder Abfrageparameter während der Laufzeit ändern.

Im Abfrageplan wird beispielsweise im Feld Ausführungsstrategie vector scan angezeigt, wenn der Optimierer feststellt, dass eine Inline-Filterstrategie für die angegebene Abfrage effizienter ist.

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 diesem Beispiel wird unter Execution Strategy der Wert Bitmap assisted vector Scan on scann_idx mit einem zugrunde liegenden Bitmap Index Scan für btree_idx angezeigt. Das bedeutet, dass bei der Vektorsuche ein Bitmap-Filter verwendet wird, der vom Bitmap-Indexscan basierend auf der int_col <= 100000000 Bedingung generiert wird. Der Custom Scan (vector scan) verarbeitet dann nur die Zeilen, die durch diese Bitmap identifiziert wurden, und integriert die Filterung direkt in den Vektorscanprozess.

Beispiel: Wie die Selektivität einen dynamischen Wechsel auslöst

Beim adaptiven Filtern werden Entscheidungen auf der Selektivität Ihrer Standardfilter basiert. Wenn ein Filter eine große Datenmenge entfernt, wählt der Optimierer wahrscheinlich die Vorabfilterung aus. Wenn der Filter die meisten Daten unverändert lässt, wählt der Optimierer wahrscheinlich die Inline-Filterung aus.

Sie können diesen dynamischen Wechsel in Echtzeit beobachten, indem Sie dieselbe Abfrage ausführen und die Selektivität Ihrer WHERE-Klausel anpassen.

Wenn Sie beispielsweise eine große Tabelle mit Einzelhandelsprodukten abfragen, möchten Sie möglicherweise eine Vektorsuche nur für Artikel unter einem bestimmten Preis durchführen.

Geringe Selektivität

Zuerst suchen Sie nach Produkten unter 1.000 $. Da fast jedes Produkt in der Datenbank unter 1.000 $ kostet, hat der Filter eine geringe Selektivität. Der AlloyDB AI-Abfrageoptimierer stellt fest, dass es ineffizient ist, fast die gesamte Datenbank in einer vorab gefilterten Liste zu erfassen, und führt daher einen Inline-Vektorscan durch.

Wenn Sie sich den Abfrageplan ansehen, sehen Sie, dass das System sich dynamisch an das massive Dataset angepasst und die Inline-Filterung ausgewählt hat.

  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)

Hohe Selektivität

Als Nächstes ändern Sie die Abfrage, um nach Produkten unter 10 $ zu suchen. Zu Beginn der Abfrageausführung bereitet der AlloyDB AI-Abfrageoptimierer zunächst die Verwendung der Inline-Filterung vor. Der Planer geht fälschlicherweise davon aus, dass der Filter nicht sehr selektiv ist. Das passiert häufiger als erwartet, da die Statistiken, die für diese Schätzungen verwendet werden, nicht immer genau oder aktuell sind. Er stellt jedoch schnell fest, dass der Preisfilter eine hohe Selektivität hat: Nur sehr wenige Artikel in der Datenbank haben einen so niedrigen Preis. Der Optimierer stellt fest, dass das Erfassen dieser wenigen Zeilen vor dem Vektorscan viel schneller ist, und wechselt daher dynamisch zur Vorabfilterung.

Der Abfrageplan spiegelt diese Echtzeitänderung wider. Das System hat das kleine Dataset vorab gefiltert, bevor die Vektoren gescannt wurden.

Erste Wahl des Planers

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)

Tatsächliche Ausführung (adaptiver Wechsel)

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)

Sie müssen Ihren Anwendungscode nicht neu schreiben oder Datenbankindexe manuell aktualisieren, wenn sich die Datenverteilung im Laufe der Zeit ändert. AlloyDB AI verarbeitet die Routinglogik für Sie bei jeder Abfrage und sorgt so für eine hohe Leistung.

Nächste Schritte