Untitled

설명: co1+col2인덱스가 col2+col1 결합 인덱스보다 인덱스를 짧게 스캔하면서 원하는 결과를 검색하고 있습니다. 그래서 결합 컬럼 인덱스 생성시 컬럼순서가 중요합니다.

예를 들어 다음과 같이 쿼리문이 있다고 하면

select * from tab1
where col1='A'
and col2 between '111' and'113'; 

※용어정리

  1. 점조건: =이나 in을 사용하면 점조건
  2. 선분조건 : beween이나 like를 사용하면 선분조건

★ 점조건이 있는 컬럼을 켤합 컬럼 인덱스의 첫번째 컬러믕로 구성하는게 선분조건이 있는 컬ㄹ럼을 첫번째 컬럼으로 구성하는 것보다 더 인덱스를 짧게 스캔할 수 있어서 성능이 더 좋습니다.

실습 예제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개의 버퍼를 읽어들이고 있습니다.