IVFベクトル索引のオプティマイザ計画

Inverted File Flat (IVF)は、近傍パーティション・ベクトル索引の形式の1つです。これは、近傍パーティションまたはクラスタを使用して検索領域を絞り込むことによって、検索効率を向上させるパーティションベースの索引です。

IVFベクトル索引を使用する場合、類似検索で考えられる2つの計画を確認できます:

  • プレフィルタリングでは、IVFベクトル索引を使用する前に、まずフィルタを評価します。オプティマイザは、スキャンする重心パーティションを選択すると、それらのパーティション内のすべての行に対してフィルタを評価します。次に、フィルタを通過した行の問合せベクトルまでの距離を計算します。
  • ポストフィルタリングでは、IVFベクトル索引を使用した後にフィルタを評価します。オプティマイザは、スキャンする重心パーティションを選択すると、そのパーティション内のすべての行について問合せベクトルまでの距離を計算します。オプティマイザは、最も近い行を検出すると、それらの行に対してフィルタを評価し、フィルタを通過する行のみを返します。

ノート:

使用しているバージョンに応じて、これらの計画のバリエーションを見つけることができます。ただし、アイデアは同じであるため、次の計画は説明のみを目的としています。

プレフィルタ計画

  • 計画行ID 7から12: この部分が最初に発生します。オプティマイザは、問合せベクトルに最も近い重心idsを選択します。
  • 計画行ID 13から14: これらの行では、重心idsが重心パーティション表と結合され、最初のステップで重心idsから識別された適格な重心パーティションからのみ行を取得します。
  • 計画行ID 4: 5から14までの行はすべて、NESTED LOOPS JOINを使用して15までの行に結合されます。つまり、行はフィルタを通過した行のみに減らされます。
  • 計画行ID 3: このステップでは、ベクトルの距離を計算し、この値でソートして、上位K行のみを保持します。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                        | Name                                                                 | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                 |                                                                      |     4 |  8112 |       |  4260   (3)| 00:00:01 |       |       |
|*  1 |  COUNT STOPKEY                   |                                                                      |       |       |       |            |          |       |       |
|   2 |   VIEW                           |                                                                      |    66 |   130K|       |  4260   (3)| 00:00:01 |       |       |
|*  3 |    SORT ORDER BY STOPKEY         |                                                                      |    66 |   127K|   144K|  4260   (3)| 00:00:01 |       |       |
|   4 |     NESTED LOOPS                 |                                                                      |    66 |   127K|       |  4217   (3)| 00:00:01 |       |       |
|   5 |      VIEW                        | VW_IVENJ_47D4581B                                                    |    88 |   880 |       |    89   (4)| 00:00:01 |       |       |
|*  6 |       HASH JOIN                  |                                                                      |    88 |   138K|       |    89   (4)| 00:00:01 |       |       |
|   7 |        PART JOIN FILTER CREATE   | :BF0000                                                              |     3 |    39 |       |     4  (25)| 00:00:01 |       |       |
|   8 |         VIEW                     | VW_IVCR_B5B87E67                                                     |     3 |    39 |       |     4  (25)| 00:00:01 |       |       |
|*  9 |          COUNT STOPKEY           |                                                                      |       |       |       |            |          |       |       |
|  10 |           VIEW                   | VW_IVCN_9A1D2119                                                     |    16 |   208 |       |     4  (25)| 00:00:01 |       |       |
|* 11 |            SORT ORDER BY STOPKEY |                                                                      |    16 |   144 |       |     4  (25)| 00:00:01 |       |       |
|  12 |             TABLE ACCESS FULL    | VECTOR$IDX_IVF_MY_DATA$75132_75138_0$IVF_FLAT_CENTROIDS              |    16 |   144 |       |     3   (0)| 00:00:01 |       |       |
|  13 |        PARTITION LIST JOIN-FILTER|                                                                      |   469 |   733K|       |    85   (3)| 00:00:01 |:BF0000|:BF0000|
|  14 |         TABLE ACCESS FULL        | VECTOR$IDX_IVF_MY_DATA$75132_75138_0$IVF_FLAT_CENTROID_PARTITIONS    |   469 |   733K|       |    85   (3)| 00:00:01 |:BF0000|:BF0000|
|* 15 |      TABLE ACCESS FULL           | MY_DATA                                                              |     1 |  1965 |       |    47   (3)| 00:00:01 |       |       |
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   1 - filter(ROWNUM<=4)
   3 - filter(ROWNUM<=4)
   6 - access("VW_IVCR_B5B87E67"."CENTROID_ID"="VTIX_CNPART"."CENTROID_ID")
   9 - filter(ROWNUM<=3)
  11 - filter(ROWNUM<=3)
  15 - filter("MY_DATA".ROWID="VW_IVENJ_47D4581B"."BASE_TABLE_ROWID" AND "MY_DATA"."CATEGORY"<>'Generic')

ノート:

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

VECTOR$<vector-index-name>$<id>$IVF_FLAT_CENTROIDS

VECTOR$DOCS_IVF_IDX2$<id>$IVF_FLAT_CENTROID_PARTITIONS

TABLE ACCESS STORAGE FULL

VECTOR$<vector-index-name>$<id>$IVF_FLAT_CENTROIDS

VECTOR$DOCS_IVF_IDX2$<id>$IVF_FLAT_CENTROID_PARTITIONS

TABLE ACCESS INMEMORY FULL

VECTOR$<vector-index-name>$<id>$IVF_FLAT_CENTROIDS

VECTOR$DOCS_IVF_IDX2$<id>$IVF_FLAT_CENTROID_PARTITIONS