AlloyDB AI の適応型フィルタリングについて理解する

このページでは、フィルタ付きベクトル検索を最適化するように設計された AlloyDB AI の機能である適応型フィルタリングの概要について説明します。

適応型フィルタリングとは

適応型フィルタリングは、クエリ実行中にクエリパターンとデータ分布を分析し、インライン フィルタリングや事前フィルタリングなど、最も効率的なフィルタリング戦略を動的に選択します。

AlloyDB AI クエリ オプティマイザーは、コストベースの分析を使用して、クエリ実行中の特定の時点でインライン フィルタリングと事前フィルタリングのどちらで最適なパフォーマンスとなるかを決定します。

このタイプの最適化は、AlloyDB AI のフィルタ付きベクトル検索をサポートします。適応型フィルタリングでは、ベクトル インデックスとメタデータ インデックスの使用が自動的に切り替わり、手動操作なしで効率的で正確な結果が得られます。

フィルタリング戦略間の動的な切り替え

適応型フィルタリングは、クエリ実行中にリアルタイムのクエリパターンとデータ分布に基づいて、インライン フィルタリングと事前フィルタリングの戦略を自動的かつ動的に切り替えます。AlloyDB AI クエリ オプティマイザーは、コストベースの分析を使用して、特定の時点で最適なパフォーマンスを提供する戦略を決定します。

インラインから事前フィルタリングへ

オプティマイザーが事前フィルタリングの方が効率的であると判断すると、適応型フィルタリングにより、実行中にインライン フィルタリングから事前フィルタリングへの切り替えがトリガーされます。クエリプランは、これを反映するように動的に変更されます。

たとえば、オプティマイザーがクエリのその時点で事前フィルタリングがより効率的であると判断した場合、プランの [実行戦略] フィールドに Bitmap assisted pre-filtering と表示されます。この動的変更は、クエリの実行中に検出された実際のデータにシステムが適応するときに行われます。

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)

Execution Strategy: Bitmap assisted pre-filtering を使用する場合、別の Bitmap Index Scan が最初に大きなデータセットをフィルタします。このプレフィルタリングで候補を効果的に絞り込むことができれば、最終的なベクトル類似度検索にベクトル インデックスは使用されません。

事前フィルタリングからインライン フィルタリングへ

AlloyDB AI クエリ オプティマイザーが現在のクエリ特性に対してインライン フィルタリングの方が効率的であると判断した場合、適応型フィルタリングは事前フィルタリングからインライン フィルタリングに動的に切り替えることもできます。

このような場合、クエリプランは、ベクトル スキャンの前に明示的な事前フィルタリング ステップなしでベクトル データのより直接的な処理を反映するように動的に調整されます。この適応性により、ランタイム中にデータ分布やクエリ パラメータが変化しても、最適なパフォーマンスを実現できます。

たとえば、オプティマイザーが特定のクエリに対してインライン フィルタリング戦略がより効率的であると判断した場合、クエリプランの [実行戦略] フィールドに vector scan と表示されます。

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)

この例では、Execution StrategyBitmap assisted vector Scan on scann_idx を表示し、btree_idxBitmap Index Scan が下層にあります。これは、ベクトル検索がビットマップ フィルタを使用することを示しています。ビットマップ フィルタは、ビットマップ インデックス スキャンが int_col <= 100000000 条件に基づいて生成します。Custom Scan (vector scan) は、このビットマップで識別された行のみを処理し、フィルタリングをベクトル スキャン プロセスに直接統合します。

次のステップ