두개의 인덱스를 같이 스캔해서 테이블 엑세스를 줄이는 방법이 앞에서 배웠던 index merge scan 입니다.
index bitmap merge scan 은 index merge 와 방식은 똑같은데 인덱스를 bitmap 으로 변환해서 인덱스의 사이즈를 아주 많이 줄인 다음 인덱스를 merge 하는게 차이 입니다. 인덱스의 사이즈가 작아지므로 인덱스를 스캔하는 시간이 짧아집니다.
예: 목차 10장 짜리를 1장으로 요약했다고 생각하면 됩니다.
그림 설명: index bitmap merge scan 은 일반 b tree 인덱스 2개를 각각 bitmap index 로 변환해서 크기를 작게 만든 다음이 2개의 bitmap 인덱스를 하나의 bitmap 인덱스로 합친 인덱스를 스캔하는 스캔방법입니다.
실습 예제 1. 아래의 환경을 만들고 index merge scan을 하시오!
튜닝 전
@demo
create index emp_job on emp(job);
create index emp_deptno on emp(deptno);
select /*+ and_equal( emp emp_job emp_deptno) */ empno, ename, job, deptno
from emp
where deptno = 30 and job='SALESMAN';
실습 예제 2. 위의 sql을 index bitmap merge scan이 되게 하시오!
튜닝후
select /*+ index_combine(emp) */empno,ename, job, deptno
from emp
where deptno = 30 and job='SALESMAN';
문제 44. 아래의 환경을 만들고 아래의 sql을 튜닝하시오
drop table mcustsum purge;
create table mcustsum
as
select rownum custno
, '2008' || lpad(ceil(rownum/100000), 2, '0') salemm
, decode(mod(rownum, 12), 1, 'A', 'B') salegb
, round(dbms_random.value(1000,100000), -2) saleamt
from dual
connect by level <= 1200000 ;
create index m_indx1 on mcustsum(custno);
create index m_indx2 on mcustsum(salemm);
create index m_indx3 on mcustsum(salegb);