Terminable Iteration for IVF Index
Use this feature if you want to ensure that the desired number of rows are returned from a search.
When using an Inverted File Flat (IVF) index, the optimizer estimates the
number of probes (nProbe
) or clusters to consider in the underlying
centroid tables. For example, if the nProbe = 5
, the five clusters
nearest to the query vector are identified and the approximate search is exclusively
made within these clusters and the results returned are based on vector proximity within
these clusters.
chunk_embedding
(vector column) within the
doc_chunks
table. The complete example can be found here : SQL Quick Start Using a Vector Embedding Model Uploaded into the DatabaseSELECT 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;
One of the existing problems is that the optimizer can under-estimate the number of probes. In this case, the query may return fewer rows than anticipated. In situations where the number of rows fetched is critical to an application, using terminable iteration with IVF indexes makes it possible to set a number (or range of rows) to be returned at a minimum. The underlying method would extend the search to more centroids ensuring that the needed K rows are returned. In order to use terminable iteration, you must specify the operation. If its optimizer cost is higher with a vector index, then the optimizer chooses not to use a vector index.
The terminable IVF index can be enabled by using one of the following methods:
Using Terminable IVF Index with Hint:
The terminable IVF index could be used by specifying a
IVF_ITERATION
as a hint in the query. For example, the above query
could be rewritten using the hint as follows :
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;
Using Terminable IVF Index with Syntax:
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;
In the above example, - 10 to 20 - enables terminable iteration. The lower bound (in this example, 10) indicates that at least 10 rows are returned by performing terminable iteration. The upper bound (in this example, 20) indicates that the query will return at most 20 rows. Lower bound and upper bound can be identical, this would still enable the terminable iteration. No rows are returned if the lower bound is larger than the upper bound or if the upper bound is zero or negative. If there are not enough centroids available to extend the search, it is possible that the query would return less than 10 rows.
Parent topic: Optimizer Plans for IVF Vector Indexes