Untitled

두개의 인덱스를 같이 스캔해서 테이블 엑세스를 줄이는 방법이 앞에서 배웠던 index merge scan 입니다.

index bitmap merge scan 은 index merge 와 방식은 똑같은데 인덱스를 bitmap 으로 변환해서 인덱스의 사이즈를 아주 많이 줄인 다음 인덱스를 merge 하는게 차이 입니다. 인덱스의 사이즈가 작아지므로 인덱스를 스캔하는 시간이 짧아집니다.

예: 목차 10장 짜리를 1장으로 요약했다고 생각하면 됩니다.

Untitled

Untitled

그림 설명: 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);