IVFベクトル索引のオプティマイザ計画
Inverted File Flat (IVF)は、近傍パーティション・ベクトル索引の形式の1つです。これは、近傍パーティションまたはクラスタを使用して検索領域を絞り込むことによって、検索効率を向上させるパーティションベースの索引です。
IVFベクトル索引を使用する場合、類似検索で考えられる2つの計画を確認できます:
- プレフィルタリングでは、IVFベクトル索引を使用する前に、まずフィルタを評価します。オプティマイザは、スキャンする重心パーティションを選択すると、それらのパーティション内のすべての行に対してフィルタを評価します。次に、フィルタを通過した行の問合せベクトルまでの距離を計算します。
- ポストフィルタリングでは、IVFベクトル索引を使用した後にフィルタを評価します。オプティマイザは、スキャンする重心パーティションを選択すると、そのパーティション内のすべての行について問合せベクトルまでの距離を計算します。オプティマイザは、最も近い行を検出すると、それらの行に対してフィルタを評価し、フィルタを通過する行のみを返します。
次の問合せについて考えてみます。
SELECT chunk_id, chunk_data,
FROM doc_chunks
WHERE doc_id=1
ORDER BY VECTOR_DISTANCE( chunk_embedding, :query_vector, COSINE )
FETCH APPROX FIRST 4 ROWS ONLY WITH TARGET ACCURACY 80;
前述の問合せは、次の2つの異なる実行計画となる可能性があります:
ノート:
使用しているバージョンに応じて、これらの計画のバリエーションを見つけることができます。ただし、アイデアは同じであるため、次の計画は説明のみを目的としています。プレフィルタ計画
- 計画明細ID 5から9: この部分が最初に発生します。オプティマイザは、問合せベクトルに最も近い重心
ids
を選択します。 - 計画行ID 10から13: これらの行では、実表は
NESTED LOOPS
結合を使用して、識別された重心パーティションに結合されます。実表がスキャンされ、WHERE
句フィルタを通過するすべての行が検索されます。これらの各行について、重心パーティションの索引が検索されます(計画行ID 13)。実表のスキャンからのrowid
は、実表のrowid
列と一致する値を持つ重心パーティション表の行を検索するために使用されます。 - 計画行ID 4: 5から9までのすべての行が、
HASH JOIN
を使用して10から13までの行に結合されます。つまり、10-13でフィルタ処理された行は、最も近いものとして選択されたパーティションの行のみに削減されます。 - 計画行ID 3: このステップでは、ベクトルの距離を計算し、この値でソートして、上位K行のみを保持します。
-------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name |
-------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | |
|* 1 | COUNT STOPKEY | |
| 2 | VIEW | |
|* 3 | SORT ORDER BY STOPKEY | |
|* 4 | HASH JOIN | |
| 5 | VIEW | VW_IVCR_2D77159E |
|* 6 | COUNT STOPKEY | |
| 7 | VIEW | VW_IVCN_9A1D2119 |
|* 8 | SORT ORDER BY STOPKEY | |
| 9 | TABLE ACCESS FULL | VECTOR$DOCS_IVF_IDX2$81357_82648_0$IVF_FLAT_CENTROIDS |
| 10 | NESTED LOOPS | |
|* 11 | TABLE ACCESS FULL | DOC_CHUNKS |
| 12 | TABLE ACCESS BY GLOBAL INDEX ROWID| VECTOR$DOCS_IVF_IDX2$81357_82648_0$IVF_FLAT_CENTROID_PARTITIONS |
|* 13 | INDEX UNIQUE SCAN | SYS_C008661 |
-------------------------------------------------------------------------------------------------------------------
ノート:
IVF索引では、補助パーティション表および関連する索引を使用して索引情報を格納します。主にVECTOR$<index name>$<ids>$IVF_FLAT_CENTROIDS
およびVECTOR$<index name>$<ids>$IVF_FLAT_CENTROIDS_PARTITIONS
です。
ポストフィルタ計画
- 計画行ID 11から15: ここでは、オプティマイザによって最も近い重心が選択されます(プレフィルタ計画の5行目から9行目と同様)。
- 計画行ID 10: これにより、どの重心
ids
が選択されたかに関する情報を含む特殊なフィルタが作成されます。 - 計画行ID 16および17: これらの行では、計画行10の特殊なフィルタを使用して、対応する重心パーティションのみをスキャンします。
- 計画行ID 9: この
HASH JOIN
は、最も近い重心ids
を持つ行のみが返されるようにします。 - 計画行ID 8: 最も近い重心
ids
を持つ行の距離を計算し、上位K行を検索します。 - 計画行ID 4: この
NESTED LOOPS
は、前に識別された上位K行に実表のフィルタを適用します。
---------------------------------------------------------------------------------------------------------------
| Id | Operation | Name |
---------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | |
|* 1 | COUNT STOPKEY | |
| 2 | VIEW | |
|* 3 | SORT ORDER BY STOPKEY | |
| 4 | NESTED LOOPS | |
| 5 | VIEW | VW_IVPSR_11E7D7DE |
|* 6 | COUNT STOPKEY | |
| 7 | VIEW | VW_IVPSJ_578B79F1 |
|* 8 | SORT ORDER BY STOPKEY | |
|* 9 | HASH JOIN | |
| 10 | PART JOIN FILTER CREATE | :BF0000 |
| 11 | VIEW | VW_IVCR_B5B87E67 |
|* 12 | COUNT STOPKEY | |
| 13 | VIEW | VW_IVCN_9A1D2119 |
|* 14 | SORT ORDER BY STOPKEY | |
| 15 | TABLE ACCESS FULL | VECTOR$DOCS_IVF_IDX4$81357_83292_0$IVF_FLAT_CENTROIDS |
| 16 | PARTITION LIST JOIN-FILTER| |
| 17 | TABLE ACCESS FULL | VECTOR$DOCS_IVF_IDX4$81357_83292_0$IVF_FLAT_CENTROID_PARTITIONS |
|* 18 | TABLE ACCESS BY USER ROWID | DOC_CHUNKS |
---------------------------------------------------------------------------------------------------------------
オプティマイザ計画のIVF索引
オプティマイザでIVF索引が使用されている場合、その計画には、アクセスされる重心および重心パーティション表の名前と、対応する索引が含まれます。
IVF索引を介してアクセスされる表のOptions
列に表示される値は、表スキャンが通常の表用かExadata表用かによって異なります。
表8-2 重心パーティション表のオプション
操作 | オプション | Object_name |
---|---|---|
TABLE ACCESS | FULL |
|
TABLE ACCESS | STORAGE FULL |
|
TABLE ACCESS | INMEMORY FULL |
|
- IVF索引の終了可能な反復
検索から必要な行数が返されるようにするには、この機能を使用します。
親トピック: ベクトル索引のオプティマイザ計画