설명: co1+col2인덱스가 col2+col1 결합 인덱스보다 인덱스를 짧게 스캔하면서 원하는 결과를 검색하고 있습니다. 그래서 결합 컬럼 인덱스 생성시 컬럼순서가 중요합니다.
예를 들어 다음과 같이 쿼리문이 있다고 하면
select * from tab1
where col1='A'
and col2 between '111' and'113';
※용어정리
★ 점조건이 있는 컬럼을 켤합 컬럼 인덱스의 첫번째 컬러믕로 구성하는게 선분조건이 있는 컬ㄹ럼을 첫번째 컬럼으로 구성하는 것보다 더 인덱스를 짧게 스캔할 수 있어서 성능이 더 좋습니다.
실습 예제1. 아래의 환경을 구성하시오!
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_salegb_salemm on mcustsum(salegb,salemm);
create index m_salemm_salegb on mcustsum(salemm,salegb);
실습 예제2. 아래의 select 문을 실행하는데 m_salegb_salemm 인덱스를 이용할 수 있도록 힌트를 주시오.
select /*+ index(t m_salegb_salemm) */ count(*)
from mcustsum t
where salegb ='A'
and salemm between '200801' and '200812';
select * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));
--버퍼는 281개
실습 예제3. 이번에는 선분조건을 선두 컬럼에 둔 m_salemm_salegb 인덱스를 엑세스 하게끔 힌트를 주시오!
select * from table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'));
select /*+ index(t m_salemm_salegb)
no_index_ss(t m_salemm_salegb)*/ count(*)
from mcustsum t
where salegb ='A'
and salemm between '200801' and '200812';
설명: 일부러 index skip scan을 하지 못하게 index_ss라는 힌트를 줬습니다.
그래서 그냥 m_salesmm_salegb 인덱스를 range 스캔하게 했더니 3090개의 버퍼를 읽어들이고 있습니다.