점심시간 문제
select ename, age, telecom
from emp19
where age = 24 and telecom ='sk';
create INDEX EMP19_TELECOM_AGE on emp19(TELECOM,age);
index skip scan 을 이해하려면 결합 컬럼 인덱스가 어떤 SQL에서 사용될 수 있는지를 먼저 이해해야 합니다.
결합 컬럼 인덱스는 결합 컬럼 인덱스의 첫번째 컬럼이 WHERE 절에 있어야지만 그 SQL이 결합 컬럼 인덱스를 사용할 수 있습니다.
꼭 알아야 할 표
실습1. 켤합 컬럼 인덱스의 첫번째 컬럼이 where절에 없으면 full table scan을 하는지 확인하시오!
create index emp_deptno_job
on emp(deptno,job);
select ename, job, deptno
from emp
where job ='MANAGER';
select * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));
설명: 결합 컬림 인덱스는 deptno+job 으로 되어 있는데 select 문의 where 절에서 검색되는 컬럼은 job만 있으면 인덱스를 사용하지 못하고 full table scan을 하게 됩니다. 결합 컬럼 인덱스의 첫번째 컬럼이 반드시 where절에 있어야 결합 컬럼 인덱스를 사용 할 수 없게 됩니다.
select /*+ index_ss(emp emp_deptno_job) */ ename,deptno, job
from emp
where job ='MANAGER';
설명: emp_deptno_job 인덱스에서 부서번호 10번부터 스캔하면서 읽어가는데 job이 manager를 찾았으면 바로 테이블 엑세스를 하러가고 그 다음이 manager가 아니면 나머지는 스킵합니다. 그리고 20번을 스캔하러 갑니다. 20번도 마찬가지로 직업이 manager를 찾았으면 바로 테이블 엑세스하러가고 나머지는 스킵합니다. 스킵을 많이 하면 많이 할수록 full table scan보다 성능이 좋습니다.
실습2. 아래의 sql이 인덱스 스킵 스캔을 하는지 실행계획을 확인하시오!
select /*+ index_ss(emp emp_deptno_job) */ ename,deptno, job
from emp
where job ='MANAGER';
select * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));
튜닝전에 full table scan 할때는 버퍼가 7개였는데 index skip scan으로 유도하니까 버퍼가 2개로 줄었습니다.