index 라는 힌트가 있는데 이 힌트를 이용하면 인덱스를 엑세스 할 수 있도록 실행계획을 생성할 수 있습니다.
@demo
create index emp_sal on emp(sal);
select /*+ index(emp emp_sal) */ ename, sal
from emp
where sal = 3000;
※ index 힌트를 사용해야하는 경우
실습예제1. 다음과 같이 2개의 인덱스를 생성하고 아래의 sql의 실행계획을 확인하시오.
create index emp_deptno on emp(deptno);
create index emp_job on emp(job);
select ename, sal, deptno, job
from emp
where deptno =20 and job ='ANALYST';
두개의 인덱스중에 옵티마이저는 어느 인덱스를 선택할까?
select count(*)
from emp
where deptno=20;
select count(*)
from emp
where job='ANALYST';
설명: 똑똑한 옵티마이저(스스로 학습하는 옵티마이저)이면 emp_job 인덱스를 선택했을 겁니다. 왜냐면 emp_job 인덱스를 통해서는 2개의 행만 엑세스하면 되지만 emp_deptno 인덱스를 통해서 엑세스하면 5개를 찾은 다음 그 다음에 직업이 anlaystd인 2건을 걸러냅니다.
그래서 옵티마이저는 비용이 적게 드는 인덱스를 선택합니다.
그런데 만약에 옵티마이져가 emp_deptno인덱스를 선택했다면 사람이 힌트를 줘서 emp_job인덱스를 선택하게 해야합니다.
select /*+ index( emp emp_job) */ ename,sal, job, deptno
from emp
where deptno =20 and job ='ANALYST';
문제 27. 아래의 sql의 인덱스를 emp_deptno를 선택하게 하는 힌트를 주고 실행하시오!
select /*+ index( emp emp_deptno) */ ename,sal, job, deptno
from emp
where deptno =20 and job ='ANALYST';
문제 28. 우리반 테이블에 다음과 같이 인덱스를 생성하고 아래의 sql이 여러개의 인덱스중 가장 좋은 인덱스를 선택할 수 있도록 힌트를 주고 실행하시오.