
FETCH APPROXIMATE (EXACT)와 옵티마이저 힌트 중 어느 것이 우선되는가
요약
Oracle AI Vector Search에서 FETCH 절의 EXACT/APPROXIMATE 설정과 옵티마이저 힌트 간의 우선순위를 실험합니다. 실험 결과, FETCH EXACT 설정 시에는 인덱스 사용 힌트가 무시되지만, FETCH APPROXIMATE 설정 시에는 인덱스 미사용 힌트가 우선 적용됨을 확인했습니다.
핵심 포인트
- FETCH EXACT 설정 시 VECTOR_INDEX_SCAN 힌트는 무시됨
- FETCH APPROXIMATE 설정 시 NO_VECTOR_INDEX_SCAN 힌트는 유효하게 작동함
- 검색 방식(EXACT/APPROXIMATE)에 따라 옵티마이저 힌트의 우선순위가 달라짐
Oracle AI Vector Search에서는 FETCH 뒤에 EXACT 또는 APPROXIMATE를 지정하여 완전 유사 검색 (벡터 인덱스를 사용하지 않음) 또는 근사 유사 검색 (벡터 인덱스를 사용함)을 제어할 수 있습니다.
또한, 옵티마이저 힌트 (Optimizer Hint)를 통해 벡터 인덱스 사용을 제어할 수 있습니다.
이에 따라, 완전 유사 검색 (FETCH EXACT)에서 VECTOR_INDEX_SCAN 힌트를 사용하면 어떻게 되는지, 근사 유사 검색 (FETCH APPROXIMATE)에서 NO_VECTOR_INDEX_SCAN 힌트를 사용하면 어떻게 되는지 실험해 보겠습니다.
실험에 사용하는 테이블과 인덱스는 다음과 같습니다. ("프리 필터링(Pre-filtering)과 인 필터링(In-filtering)"에서 사용한 것과 동일)
SQL> info testtab1
TABLE: TESTTAB1
LAST ANALYZED:2026-06-29 05:41:47.0
...
완전 유사 검색 × VECTOR_INDEX_SCAN 힌트부터 시도합니다.
먼저 VECTOR_INDEX_SCAN 힌트를 붙이지 않고 실행 계획 (Execution Plan)을 확인합니다.
SQL> explain plan for select /*+ NO_PARALLEL */ id from testtab1 order by vector_distance(:qvec, vec) fetch exact first 10 rows only;
★
Explained.
...
예상대로 인덱스는 사용되지 않았습니다.
VECTOR_INDEX_SCAN 힌트를 붙여서 실행 계획을 확인합니다.
SQL> explain plan for select /*+ NO_PARALLEL VECTOR_INDEX_SCAN(testtab1) */ id from testtab1 order by vector_distance(:qvec, vec) fetch exact first 10 rows only;
★ ★
Explained.
...
실행 계획에 변화는 없었습니다. (FETCH EXACT가 우선되었습니다)
힌트 리포트에도 Unused로 출력되어 있습니다.
다음으로, 근사 유사 검색 × NO_VECTOR_INDEX_SCAN 힌트를 시도합니다.
먼저 NO_VECTOR_INDEX_SCAN 힌트를 붙이지 않고 실행 계획을 확인합니다.
SQL> explain plan for select /*+ NO_PARALLEL */ id from testtab1 order by vector_distance(:qvec, vec) fetch approximate first 10 rows only;
★
Explained.
...
예상대로 인덱스가 사용되고 있습니다.
NO_VECTOR_INDEX_SCAN 힌트를 붙여서 실행 계획을 확인합니다.
SQL> explain plan for select /*+ NO_PARALLEL NO_VECTOR_INDEX_SCAN(testtab1) */ id from testtab1 order by vector_distance(:qvec, vec) fetch approximate first 10 rows only;
★ ★
Explained.
...
실행 계획에 변화가 있었습니다. (NO_VECTOR_INDEX_SCAN 힌트가 우선되었습니다)
완전 유사 검색 때와는 다른 결과입니다.
덧붙여서, 쿼리 변환 처리를 제어하는 옵티마이저 힌트도 시도해 보겠습니다.
먼저 자연스러운 상태의 프리 필터링 (Pre-filtering) 케이스입니다.
SQL> explain plan for select /*+ NO_PARALLEL */ id from testtab1 where col1='Y' order by vector_distance(:qvec, vec) fetch approximate first 10 rows only;
Explained.
SQL> select * from table(dbms_xplan.display);
...
다음은 자연스러운 상태의 인 필터링 (In-filtering) 케이스입니다.
다음은 자연스러운 상태의 인 필터링 (In-filtering) 케이스입니다.
SQL> explain plan for select /*+ NO_PARALLEL */ id from testtab1 where col9='Y' order by vector_distance(:qvec, vec) fetch approximate first 10 rows only;
Explained.
SQL> select * from table(dbms_xplan.display);
...
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기