본문 바로가기

IT관련

오라클 Local Partitioned Index (로컬 파티션 인덱스)

파티션 테이블에 대해 2가지 종류의 파티션 인덱스를 생성할 수 있습니다.

 

    - Local Partitioned Index (지역 파티션 인덱스, 로컬 인덱스)

    - Global Partitioned Index (전역 파티션 인덱스, 글로벌 인덱스)

 

로컬 인덱스는 파티션테이블과 똑같은 구성으로 인덱스를 파티션하는 것을 말합니다.

즉, 인덱스의 파티션을 구분하는 파티션키를 테이블의 파티션키와 같은 것을 사용하는다는 의미입니다.

 

-- 1) 파티션 테이블 생성
create table SALES (
  sales_no       number,
  sale_year      number,
  sale_month     number,
  sale_day       number,
  customer_name  varchar2(30),
  birth_date     date,
  price          number
)
partition by range (sales_no)
(
  partition SALES_P1 values less than (3),
  partition SALES_P2 values less than (5),
  partition SALES_P3 values less than (maxvalue)
);

-- 2) 로컬 파티션 인덱스 생성
create index IDX_SALES_01 on SALES (sales_no) LOCAL;

 

위에서는 sales_no 컬럼을 기준으로 Range 파티션되어 있는 SALES 테이블에 대해 로컬 파티션 인덱스를 생성한 샘플입니다. 딱 한줄~ 매우 간단하죠.

보통의 인덱스 생성문 SQL 맨뒤에 LOCAL 키워드만 붙여주면 됩니다.

 

로컬 인덱스의 경우, 어차피 테이블의 파티션 구성과 똑같이 만들어지기 때문에 파티션키를 지정하거나 파티션명을 지정할 필요도 없습니다.

 

만들어진 IDX_SALES_01 인덱스의 파티션명이 테이블의 파티션명을 그대로 따라 감을 확인할 수 있습니다.

 

 

로컬 인덱스, 글로벌 인덱스의 여부는 파티션키를 테이블의 파티션키를 사용하는 지에 의해서만 구분됩니다.

인덱스 키컬럼은 다른 것을 사용할 수 있습니다.

 

-- 로컬 파티션 인덱스 생성 (인덱스키가 파티션키와 다름)
create index IDX_SALES_01 on SALES (customer_name) LOCAL;

 

위 로컬 인덱스에서 인덱스키는 customer_name 컬럼을 사용했습니다.

파티션키는 테이블 파티션키인 sales_no 을 사용합니다.

즉, 위 로컬 인덱스는 sales_no 를 기준으로 파티션이 구성되고, 인덱스키는 customer_name 이 되겠습니다.

 

 

위에서 살펴본 것처럼, 로컬 인덱스는 테이블 파티션 구성을 따라가기 때문에 인덱스 생성 구문이 매우 간단하지만, 자유도가 글로벌 인덱스에 비해서는 다소 떨어집니다.

즉, 다른 파티션키를 사용해서 인덱스를 만들 수 없습니다.

테이블에서 sales_no 를 기준으로 파티션되어 있는데, customer_name 컬럼으로 파티션을 구성할 수는 없습니다.

 

또, 테이블에서는 Range 파티션으로 구성했는데, 인덱스는 Hash 파티션이나 List 파티션으로 다르게 구성할 수 없습니다. 적어도 로컬 인덱스에서는요 ...

 

하지만, 글로벌 인덱스에서는 이 모든게 가능합니다.

파티션키도, 파티션 방식도 테이블과 완전 다르게 구성이 가능합니다. 자유도가 완전 높죠~

 

 

그럼, 글로벌 파티션 인덱스를 쓰는게 무조건 좋은것 아니야? 라고 생각할 수 있겠지만... 사실은 반대입니다.

로컬 파티션을 사용하는 것이 더 좋습니다.

파티션의 특성상 특정 파티션만 잘라내거나, 추가하거나 하는 작업들을 하게되는데,

이때, 로컬 인덱스는 해당 작업대상 파티션의 인덱스만 영향을 받고 나머지 인덱스들은 멀쩡하게 남아있습니다.

 

하지만, 글로벌 인덱스는 아작 납니다. 인덱스를 전체 다시 리빌드(rebuild) 해줘야 합니다.

그전까지는 Invalid 상태가 되고 사용불가하죠~

 

따라서 로컬 인덱스를 가급적 써야 합니다만... ㅎㅎ 하다보면 글로벌 인덱스를 어쩔 수 없이 써야하는 상황이 생기곤 하죠 ~

 

 글로벌 파티션 인덱스 보기 

 오라클 파티션 종합 페이지 보기