ベクトル索引のヒント

問合せの実行中に、オプティマイザでは既存の索引は選択されないが、その索引を使用させる場合は、ベクトル索引のヒントを含めるようにSQL文を書き換えることができます。

ベクトル索引のヒントには、次の2つのタイプがあります:

  • アクセス・パスのヒントは、述語のない単一の表および有効なHNSWベクトル索引を含む単純な問合せブロックを実行する場合に適用されます。これは、HNSWベクトル索引にのみ適用されます。
  • 問合せ変換のヒントは、問合せ変換が使用される他のすべてのケースを対象としています。

アクセス・パスのヒントの構文

アクセス・パスのヒントは、既存のINDEXヒントをモデルにしています。次に例を示します。

VECTOR_INDEX_SCAN ( [ @ queryblock ] tablespec [ indexspec ])

NO_VECTOR_INDEX_SCAN ( [ @ queryblock ] tablespec [ indexspec ])

VECTOR_INDEX_SCANヒントは、指定した表にベクトル索引スキャンを使用するようオプティマイザに指示します。索引はオプションで指定されます。オプティマイザは全表スキャンを検討しません。

NO_VECTOR_INDEX_SCANは、オプションで指定したベクトル索引スキャンの使用を無効にします。

関連項目:

アクセス・パスのヒントの例

SELECT /*+ VECTOR_INDEX_SCAN(galaxies) */ name
FROM galaxies
ORDER BY VECTOR_DISTANCE( embedding, to_vector('[0,1,1,0,0]'), COSINE )
FETCH FIRST 3 ROWS ONLY;
SELECT /*+ NO_VECTOR_INDEX_SCAN(galaxies) */ name
FROM galaxies
ORDER BY VECTOR_DISTANCE( embedding, to_vector('[0,1,1,0,0]'), COSINE )
FETCH FIRST 3 ROWS ONLY;

2番目の問合せの例ではベクトル索引を使用しないことが想定されていますが、これはオプティマイザが従うこともあれば、従わないこともあるヒントにすぎないことに注意してください。索引が確実に使用されないようにするには、次のようにヒントではなく、EXACTを使用することをお薦めします:

SELECT name
FROM galaxies
ORDER BY VECTOR_DISTANCE( embedding, to_vector('[0,1,1,0,0]'), COSINE )
FETCH EXACT FIRST 3 ROWS ONLY;

問合せ変換のヒントの構文

問合せ変換のヒントの構文は、INDEXヒント・モデルに似ています。次に例を示します。

VECTOR_INDEX_TRANSFORM ( [ @ queryblock ] tablespec [ indexspec [ filtertype ]] )

NO_VECTOR_INDEX_TRANSFORM ( [ @ queryblock ] tablespec [ indexspec ] )

VECTOR_INDEX_TRANSFORMは変換を強制し、オプションで指定された索引を使用しますが、NO_VECTOR_INDEX_TRANSFORMは、変換およびオプションで指定された索引の使用を無効にします。潜在的な問合せ変換の詳細は、「HNSWベクトル索引のオプティマイザ計画」および「IVFベクトル索引のオプティマイザ計画」を参照してください。

VECTOR_INDEX_TRANSFORMヒントのオプションのfiltertypeには、次の値を指定できます:

  • PRE_FILTER_WITH_JOIN_BACK (HNSW索引にのみ適用されます)
  • PRE_FILTER_WITHOUT_JOIN_BACK (HNSW索引とIVF索引の両方に適用されます)
  • IN_FILTER_WITH_JOIN_BACK (HNSW索引にのみ適用されます)
  • IN_FILTER_WITHOUT_JOIN_BACK (HNSW索引にのみ適用されます)
  • POST_FILTER_WITHOUT_JOIN_BACK (IVF索引にのみ適用されます)

filtertype値は、問合せ変換の1つの状態のみに対応します。VECTOR_INDEX_TRANSFORMヒントにfiltertype値が指定されていない場合、有効なすべてのフィルタリング・タイプが考慮され、最適なものが選択されます。

ノート:

filtertype値を指定する場合は、indexspec値も指定する必要があります。

関連項目:

問合せ変換のヒントの例

SELECT /*+ vector_index_transform(galaxies galaxies_ivf_idx pre_filter_without_join_back) */ name
FROM galaxies
WHERE id<5
ORDER BY VECTOR_DISTANCE( embedding, to_vector('[0,1,1,0,0]'), COSINE )
FETCH FIRST 3 ROWS ONLY WITH TARGET ACCURACY 90;
SELECT /*+ vector_index_transform(galaxies) */ name
FROM galaxies
WHERE id<5
ORDER BY VECTOR_DISTANCE( embedding, to_vector('[0,1,1,0,0]'), COSINE )
FETCH FIRST 10 ROWS ONLY WITH TARGET ACCURACY 90;
SELECT /*+ no_vector_index_transform(galaxies) */ name
FROM galaxies
WHERE id<5
ORDER BY VECTOR_DISTANCE( embedding, to_vector('[0,1,1,0,0]'), COSINE )
FETCH FIRST 10 ROWS ONLY WITH TARGET ACCURACY 90;
SELECT /*+ vector_index_transform(galaxies galaxies_hnsw_idx in_filter_with_join_back) */ name
FROM galaxies
WHERE id<5
ORDER BY VECTOR_DISTANCE( embedding, to_vector('[0,1,1,0,0]'), COSINE )
FETCH FIRST 10 ROWS ONLY WITH TARGET ACCURACY 90;

ノート:

  • ベクトル索引の補助表は通常のヒープ表であり、コスト計算を正確に行うにはオプティマイザ統計が最新である必要があります。自動オプティマイザ統計収集タスクは、実表の統計を収集する場合にのみ、補助表の統計を収集します。
  • DBMS_STATSパッケージを使用すると、補助表に対して手動統計収集操作を実行できます。ただし、ベクトル索引に対するGATHER_INDEX_STATSは許可されません。インメモリーHNSW索引は、その統計をメモリー内に自動的に保持します。

関連項目:

前述のSQL例は、次のものに基づいています:

DROP TABLE galaxies PURGE;
CREATE TABLE galaxies (id NUMBER, name VARCHAR2(50), doc VARCHAR2(500), EMBEDDING VECTOR);
-- or CREATE TABLE galaxies (id NUMBER, name VARCHAR2(50), doc VARCHAR2(500), EMBEDDING VECTOR(5,INT8));
 
INSERT INTO galaxies VALUES (1, 'M31', 'Messier 31 is a barred spiral galaxy in the Andromeda constellation which has a lot of barred spiral galaxies.', '[0,2,2,0,0]');
INSERT INTO galaxies VALUES (2, 'M33', 'Messier 33 is a spiral galaxy in the Triangulum constellation.', '[0,0,1,0,0]');
INSERT INTO galaxies VALUES (3, 'M58', 'Messier 58 is an intermediate barred spiral galaxy in the Virgo constellation.', '[1,1,1,0,0]');
INSERT INTO galaxies VALUES (4, 'M63', 'Messier 63 is a spiral galaxy in the Canes Venatici constellation.', '[0,0,1,0,0]');
INSERT INTO galaxies VALUES (5, 'M77', 'Messier 77 is a barred spiral galaxy in the Cetus constellation.', '[0,1,1,0,0]');
INSERT INTO galaxies VALUES (6, 'M91', 'Messier 91 is a barred spiral galaxy in the Coma Berenices constellation.', '[0,1,1,0,0]');
INSERT INTO galaxies VALUES (7, 'M49', 'Messier 49 is a giant elliptical galaxy in the Virgo constellation.', '[0,0,0,1,1]');
INSERT INTO galaxies VALUES (8, 'M60', 'Messier 60 is an elliptical galaxy in the Virgo constellation.', '[0,0,0,0,1]');
INSERT INTO galaxies VALUES (9, 'NGC1073', 'NGC 1073 is a barred spiral galaxy in Cetus constellation.', '[0,1,1,0,0]');

HNSW索引の場合:

CREATE VECTOR INDEX galaxies_hnsw_idx ON galaxies (embedding)
ORGANIZATION INMEMORY NEIGHBOR GRAPH
DISTANCE COSINE
WITH TARGET ACCURACY 95;

IVF索引の場合:

CREATE VECTOR INDEX galaxies_ivf_idx ON galaxies(embedding)
ORGANIZATION NEIGHBOR PARTITIONS
DISTANCE COSINE
WITH TARGET ACCURACY 95;