index unique scan을 알고, range scan과 비교해보자
: 중복되지 않은 컬럼에만 걸 수 있는 인덱스
empno
는 중복되지 않은 유니크한 컬럼이다.
create unique index emp_empno on emp(empno);
INDEX RANGE SCAN
과 다르게, 만약 사원번호 7788을 찾을 경우 한번 더 읽지 않고 (값이 중복되지 않으므로) 바로 ROWID로 테이블 행을 찾으러 간다.
select /*+ gather_plan_statistics */ empno, ename
from emp
where empno=7788;
select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));
만약, emp_empno 인덱스
와 emp_ename 인덱스
가 있는 경우
select /*+ gather_plan_statistics */ empno, ename, sal
from emp
where ename='SCOTT' and empno=7788;
위의 sql에서 오라클의 옵티마이저는 unique index
를 선택한다.
딱 하나의 행만 선택하기 때문이다!