IVF索引の終了可能な反復

検索から必要な行数が返されるようにする場合は、この機能を使用します。

Inverted File Flat (IVF)索引を使用する場合、オプティマイザは基礎となる重心表で考慮するプローブ(nProbe)またはクラスタの数を推定します。たとえば、nProbe = 5の場合、問合せベクトルに最も近い5つのクラスタが識別され、近似検索がこれらのクラスタ内で排他的に行われ、返される結果はこれらのクラスタ内のベクトル近接性に基づきます。

doc_chunks表内のchunk_embedding (ベクトル列)にIVF索引が作成される次の問合せについて考えてみます。完全な例は、「データベースにアップロードされたベクトル埋込みモデルの使用によるSQLクイック・スタート」を参照してください。
SELECT chunk_id, chunk_data,
FROM doc_chunks
WHERE doc_id=1
ORDER BY VECTOR_DISTANCE( chunk_embedding, :query_vector, COSINE )
FETCH APPROX FIRST 10 ROWS ONLY WITH TARGET ACCURACY 80;

既存の問題の1つは、オプティマイザがプローブの数を過小評価する場合があることです。この場合、問合せによって返される行が予想より少なくなる可能性があります。フェッチされる行数がアプリケーションで重要な場合、IVF索引で終了可能な反復を使用すると、最低限返される数(または行の範囲)を設定できます。基礎となる方法では、必要なK行が返されるように、検索がより重心に対して拡張されます。終了可能な反復を使用するには、操作を指定する必要があります。ベクトル索引を使用するとオプティマイザのコストが高い場合、オプティマイザはベクトル索引を使用しないことを選択します。

終了可能なIVF索引は、次のいずれかの方法を使用して有効にできます:

ヒントでの終了可能なIVF索引の使用:

終了可能なIVF索引は、問合せでヒントとしてIVF_ITERATIONを指定することで使用できます。たとえば、前述の問合せは、次のようにヒントを使用して書き換えることができます:

SELECT /*+ IVF_ITERATION*/ chunk_id, chunk_data,
FROM doc_chunks
WHERE doc_id=1
ORDER BY VECTOR_DISTANCE( chunk_embedding, :query_vector, COSINE )
FETCH APPROX FIRST 10 ROWS ONLY WITH TARGET ACCURACY 80;

構文での終了可能な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 10 to 20 ROWS ONLY WITH TARGET ACCURACY 80;

前述の例で、10 - 20によって終了可能な反復が有効になります。下限(この例では10)は、終了可能な反復を実行することで少なくとも10行が返されることを示します。上限(この例では20)は、この問合せで最大20行が返されることを示します。下限と上限は同じにすることができ、終了可能な反復が有効になります。下限が上限よりも大きい場合、または上限がゼロまたは負の場合、行は返されません。検索を拡張できる十分な重心がない場合、問合せで返される行が10行未満になる可能性があります。