미스터 역마살

[ORACLE]인덱스 파티셔닝 본문

Database/ORACLE

[ORACLE]인덱스 파티셔닝

Mr. YeokMaSsal 2016. 7. 27. 14:12
728x90
반응형


♣ 인덱스 파티셔닝이란?

  인덱스도 테이블처럼 파티션 여부에 따라 비파티션 인덱스와 파티션 인덱스로 나뉘고 파티션 인덱스는 각 인덱스 

   파티션이 담당하는 테ㅔ이블 파티션 범위엥 따라 글로벌과 로컬로 나뉘게 된다. 

   아래 그림을 보면서 이야기를 나눠보자



로컬 파티션 인덱스는, 각 테이블 파티션과 인덱스 파티션이 서로 1:! 대응관게가 되도록 오라클이 자동으로 관리하는 파티션 인덱스를 말한다. 로컬이 아닌 파티션 인덱스는 모두글로벌 파티션 인덱스에 속하며, 테이블 파티션과 독립적인 구성을 갖는다.



♣ Local Partition Index

- 로컬 파티션 인덱스는 각 인덱스 파티션이 테이블 파티션과 1:1 대응관계를 가지며 테이블 파티션 속성을 그대로
   상속 받는다. 파티셔닝을 전제로 하므로 흔히 '로컬 인덱스'라고 줄여서 부른다.

 - 파티션 키를 사용자가 따로 정의하지 않아도 오라클이 자동으로 관리하는 것이 특징이다.

 - 테이블 파티션과 1:1 관계가 되도록 사용자가 수동으로 인덱스 파티션을 구성하더라도 이를
   로컬 파티션인덱스라고 부르지 않는 이유는 여기에 있다.

 - 로컬 파티션 인덱스는 항상 테이블 파티션과 1:! 관계를 형성하므로 만약 테이블이 결합 파티셔닝 되어 있다면
   인덱스도 같은 단위로 파티셔닝 된다.

 - 로컬 파티션 인덱스가 갖는 장점은 무엇보다 관리적 편의성에 있다. 테이블 파티션 구성에 변경이 생기더라도
   인덱스를 재생성 할 필요가 없어 관리비용이 아주 적다.




♣ Non Partition Index

- Non partition index는 말그대로 파티셔닝하지 않은 인덱스를 말한다.

 - 만약 테이블만 파티셔닝이 되어있다면 1:M의 관계를 가지게 된다. 즉 하나의 인덱스 세그먼트가 여러 테이블 파티션
   세그먼트와 관계를 갖는다. 그런 의미에서 비파티션 인덱스를 '글로벌 비 파티션 인덱스' 라고 부르기도 한다.




♣ Global Partition Index

- 글로벌 파티션 인덱스는 테이블 파티션과 독립적인 구성을 갖도록 파티셔닝하는 것을 말한다.

 - 테이블은 파티셔닝이 되어 있지 않을 수도 있다.

 - 독립적 구성이라는 점에서 효용성이 높을것처럼 보이지만 몇몇 제약사항 때문에 오히려 효용성이 낮은 편이다.
   글로벌 파티션 인덱스 사용을 불편하게 만드는 가장 큰 제약은 기준 테이블의 파티션 구성에 변경이 생길때마다
   인덱스가 unusable 상태로 바뀌고 그때마다 인덱스를 재생성해야 한다는 것이다. 이제약은 비 파티션 인덱스
   일때도 똑같이 나타난다. 

 - 9i 부터 update global indexes 옵션을 주면 파티션 DDL 작업에 의해 영향받는 인덱스 레코드를 자동으로
   갱신해주므로 인덱스가 unusale 상태로 빠지지 않는다.

 - 하지만 파티션 DDL로 인해 영향받는 레코드가 전체의 5% 미만일때만 유용하다. 이상일 겨웅는 인덱스 재생성하는
   것보다 오히려 늦다.




♣ Prefixed VS NonPrefixed

 - Prefixed : 파티션 인덱스를 생성할 때 파티션 키 컬럼을 인덱스 키 컬럼 왼쪽선두에 두는 것을 말한다.

 - NonPrefixed : 파티션 인덱스를 생성할 때 파티션 키 컬럼을 인덱스 키 컬럼 왼쪽선두에 두지 않는 것을 말하며
                     파티션 키카 인덱스 컬럼에 아예 속하지 않을때도 여기에 속한다. 


o 글로벌 파티션 인덱스는 Prefixed 파티션만 지원된다!!




♣ Global Partition Index 의 효용성

 - 결론부터 말하면 글로벌 파티션 인덱스는 경합을 분산시키려고 글로벌 해시 파티셔닝하는 경우 외에는
   거의 사용되지 않는 실정이다.

 - '비파티션 테이블에 대한 글로벌 파티션 인덱스', '파티션 테이블에 대한 글로벌 파티션 인덱스'로 나누어
   생각해 볼 수 있는데, 전자의 경우 테이블을 파티셔닝하지 않을 정도로 중소형급 테이블이면 굳이 인덱스만을
   따로 파티셔닝 할 이유는 없어보인다.

 - 후자 즉 '파티션 테이블에 대한 글로벌 파티션 인덱스'의 효용성은 파티션 테이블에 대해서도 글로벌 파티션
   인덱스보다는 로컬 파티션 인덱스와 비파티션 인덱스가 주로 사용되고 있으며 그 이유는 아래와 같다.

  1) 테이블과 같은 컬럼으로 파티셔닝 하는 경우 

     테이블은 날짜 컬럼 기준으로 월별 파티셔닝하고, 인덱스는 분기별 파티셔닝하는 경우를 예로 들어보게 되면
     글로벌 파티션 인덱스에는 Prefixed 파티션만 허용되므로 날짜 컬럼을 선두에 둬야 하는데, 날짜 조건은 대게
     범위검색조건이 사용되므로 인덱스 스캔효율면에서 불리하다. 특히 NL조인에서 Inner 테이블 엑세스를 위해
     자주사용되는 인덱스라면 비효율이 더 크게 작용한다. 다른 '=' 조건 컬럼을 인덱스 선두에 둘 수 있다는 측면에선  
     Local Non Prefixed Partition Index가 훨씬 유리하다.


  2) 테이블과 다른 컬럼으로 파티셔닝 하는 경우 

     테이블 파티션 기준인 날짜 이외 컬럼으로 인덱스를 글로벌 파티셔닝 할 수 있는데, (인덱스 경합을 분산하려는
    경우가 아니라면) 그런 구성은 대개 인덱스를 적정 크기로 유지하려는 데에 목적이 있다. 인덱스가 너무 커지면
    관리하기 힘들고 인덱스 높이가 증가해 엑세스 효율도 나빠지기 때문이다.




♣ 인덱스 파티셔닝 제약을 고려한 데이터베이스 설계

 - Unique 파티션 인덱스를 정의할 때는 인덱스 파티션 키가 모두 인덱스 구성컬럼에 포함되어야 한다. 이 제약이
   없다면 인덱스 키 값을 변경하거나 새로운 값을 입력할 때마다 중복값 체크를 위해 매번 많은 인덱스 파티션을
   탐색해야 하므로 DML 성능이 저하된다. 따라서 당연히 필요한 제약이라고 할 수 있다.

 - 글로벌 파티션 인덱스는 Prefixed 파티션 이어야 한다.



-끝-





728x90
Comments