wif LiNoUz/Oracle,Sql

로컬 인덱스, 글로벌 인덱스

크라소니 2014. 6. 15. 00:08

http://www.dbguide.net/knowledge.db?boardUid=126088&cmd=view





로컬 인덱스로 파티션 테이블의 가용성을 높여라

 

우리가 양복을 입어야 할 경우에 신발은 어떤 것을 신어야 하는가? 만약, 양복을 입고 고무신을 신는다면 어떻겠는가? 상상만해도 웃음이 나올 것이다. 양복을 입었으면 그에 맞는 구두를 신어야 할 것이다. 테이블을 파티션 테이블로 구성하고 인덱스는 일반 인덱스로 생성한다면 이는 위와 동일한 현상일 것이다. 우리가 몰라서 웃지 못할 뿐이지 파티션 테이블에 일반 인덱스를 생성하는 것이 어찌 양복에 고무신을 신는 것과 다르겠는가? 데이터가 점점 더 증가하면서 파티션 테이블을 사용해야 할 경우가 많아지고 있다. 그렇다는 이야기는 인덱스 또한 파티션 인덱스의 사용이 증가하게 된다는 것이다. 이제 파티션 테이블을 이해했다면 파티션 테이블보다 더 중요한 파티션 인덱스에 관심을 가지길 바란다. 이번 호에서는 파티션 인덱스 중 로컬(LOCAL) 인덱스를 확인해 보겠다.

 

권순용 kwontra@hanmail.net

 

 

이것이 로컬 인덱스다

 

 

파티션 인덱스는 우선 크게 로컬(LOCAL) 인덱스와 글로벌(GLOBAL) 인덱스로 구분된다. 그렇다면 로컬과 글로벌은 무엇을 의미하는가? 사실 이름보다는 각각의 특징을 정확하게 이해하는 것이 더욱 중요하다. 파티션 인덱스는 로컬인지 또는 글로벌인지에 따라 특징이 좌우되기 때문이다. 어떤 파티션 인덱스를 생성해야 할지를 올바르게 선택할 수 있으려면, 각각의 파티션 인덱스의 특징을 이해해야 하는 것은 당연한 일일 것이다.

 

로컬 인덱스의 정의

 

테이블의 구조와 인덱스의 구조가 동일한 경우를 로컬 인덱스라고 한다. 이 뜻은 무엇인가? 예를 들어, 테이블이 파티션 테이블이며 거래일자 컬럼으로 월별 데이터에 의해 범위(RANGE) 파티션으로 구성되어 있다고 가정하자. 이와 같다면 어떠한 형태의 테이블이 생성되는가? 해당 테이블에 2007년 7월 데이터부터 2007년 12월 데이터까지 함께 저장되어 있다면 7월 파티션부터 12월 파티션까지 여섯 개의 파티션이 존재하게 될 것이다. 각각의 파티션은 세그먼트와 같기 때문에 서로 다른 디스크에 저장될 수 있다. 결국, 해당 테이블은 거래일자 컬럼에 의해 월별로 데이터가 분리되어 디스크에 저장된다.

 

 

로컬 인덱스의 구조

 

 

로컬 인덱스는 이와 동일한 구조를 가지는 파티션 인덱스를 의미한다. 파티션 테이블의 인덱스가 물리적으로 거래일자 컬럼으로 월별로 분리되어 구성된다면 해당 파티션 인덱스도 여섯 개의 파티션으로 구성될 것이다. 이와 같다면 2007년 7월 테이블 파티션과 1:1의 관계를 가지는 2007년 7월 인덱스 파티션도 존재할 것이다. 나머지 다섯 개의 테이블 파티션도 동일하게 다섯 개의 인덱스 파티션과 각각 1:1의 관계를 가지게 될 것이다. 이와 같이 테이블의 파티션 구조와 인덱스의 파티션 구조가 동일하다면 해당 인덱스는 로컬 인덱스가 된다.

 

로컬 인덱스 생성하기

 

로컬 인덱스를 구성하려면 기본적으로 로컬 인덱스를 생성하는 방법을 알고 있어야 한다. 파티션 인덱스를 생성하는 것이 아무리 쉬운 작업이라고 하더라도 파티션 인덱스를 생성하지 않고 어떻게 파티션 인덱스를 논할 수 있겠는가? 우선, 파티션 인덱스 중 로컬 인덱스를 생성하는 SQL을 확인해 보자.

 

====================================================
CREATE TABLE HISTORY
(
YYYYMMDD CHAR(8) NOT NULL,
고객번호 CHAR(6) NOT NULL
)
PARTITION BY RANGE (YYYYMMDD)
(PARTITION 200708 VALUES LESS THAN ('20070832') TABLESPACE T_TS,
PARTITION 200709 VALUES LESS THAN ('20070932') TABLESPACE T_TS);

CREATE INDEX HISTORY_LOCAL_IDX ON HISTORY(고객번호) LOCAL;
====================================================

 

위와 같이 로컬 인덱스를 생성할 수 있으며 위의 SQL에서 첫 번째 SQL은 파티션 테이블을 생성하는 SQL이다. 두 번째 SQL이 로컬 인덱스를 생성하는 SQL이며 단지 마지막에 로컬 옵션을 설정하면 된다. 위와 같이 생성한다면 해당 인덱스는 YYYYMMDD 컬럼으로 데이터를 분리하여 인덱스 파티션을 구성하게 된다. 그렇기 때문에 200708 인덱스 파티션과 200709 인덱스 파티션 두개가 생성된다. 이와 같은 이유는 로컬 옵션이 기존 파티션 테이블과 동일한 구조를 생성하기 때문이다.

 

 

로컬 인덱스의 특징 이해하기

 

 

로컬 인덱스는 테이블 파티션의 구조와 인덱스의 파티션 구조가 동일하기 때문에 이로 인해 특징이 정해진다. 로컬 인덱스의 특징을 한마디로 요약한다면 관리를 효과적으로 수행할 수 있는 구조를 가진 인덱스라고 말할 수 있다. 그렇다면 로컬 인덱스는 어떤 특징을 가지고 있기에 관리를 효과적으로 수행할 수 있는 것인가? 이제부터 로컬 인덱스의 특징을 하나 하나 확인해 보자.

 

보관 주기 관리의 용이성

 

첫 번째로 보관 주기 관리의 특징을 확인해 보자. 파티션 테이블을 이야기하면서 범위(RANGE) 파티션의 가장 큰 특징은 보관 주기 관리의 용이라고 언급을 했었다. 1월 파티션과 2월 파티션이 존재하는 범위 파티션 테이블이 존재한다고 가정하자. 1월 파티션이 보관 주기가 종료되어 필요 없어진다면 1월 파티션은 제거해야 할 것이다. 이와 같은 경우 파티션 DROP을 수행하여 어떠한 성능 저하 및 소요 시간 없이 필요 없는 과거 데이터를 제거할 수 있었다. 하지만, 위와 같이 범위 파티션에서 보관 주기 관리가 최적화되려면 인덱스를 반드시 고려해야 한다. 테이블은 월별 파티션으로 구성되어 있지만 인덱스가 월별 파티션으로 구성되어 있지 않고 단일 인덱스로 구성되어 있거나 또는 글로벌 인덱스로 구성되어 있다면 필요 없는 테이블 파티션을 DROP 한 후에는 전체 인덱스가 사용 불가 상태로 변하게 된다. 그렇다면 인덱스를 이용하기 위해 인덱스 재구축 작업을 수행해야 한다. 인덱스 재구축 작업을 수행하게 되면 해당 인덱스를 이용하는 SQL들은 문제를 발생시킬 수 있다. 따라서, 테이블은 파티션으로 구성되어 있지만 인덱스가 동일한 구조의 파티션으로 구성되지 않는다면 완벽한 보관 주기 관리는 수행되지 못할 것이다.

 

그렇다면 보관 주기를 관리하기 위해서는 파티션 테이블의 인덱스는 어떻게 구성해야 하는가? 그 답은 매우 간단하다. 파티션 테이블을 구조와 파티션 인덱스의 구조를 동일하게 구성하면 될 것이다. 이 뜻은 파티션 테이블을 거래일자 컬럼으로 월별로 범위 파티션을 구성했다면 인덱스 또한 거래일자 컬럼으로 월별로 파티션을 구성하면 된다는 것이다. 이와 같다면 1월 테이블 파티션이 DROP 될 경우 그와 매칭되는 1월 파티션 인덱스가 자동으로 DROP 되면 될 것이다. 테이블의 파티션 구조와 인덱스의 파티션 구조가 동일해야만 파티션 DROP 시 인덱스 재구? 주기 관리를 수행하기 위해서는 로컬 인덱스 구조로 구성해야 할 것이다.

 

테이블 파티션 DIRECT LOADING 작업 가능

 

두 번째로 로컬 인덱스의 독립적인 작업을 확인해 보자. 로컬 인덱스는 테이블의 파티션 구조와 인덱스의 파티션 구조가 동일하다. 그렇기 때문에 테이블 파티션 중 하나의 파티션에 작업을 수행하는 경우 인덱스는 사용 불가 상태로 변경되지 않게 된다.

 

예를 들어, 테이블 파티션을 추가한다면 인덱스도 동일한 구조의 파티션을 가지게 되므로 인덱스 파티션에도 자동으로 새로운 인덱스 파티션을 추가하게 될 것이다. 이와 같은 작업 중에 우리는 인덱스에 대한 어떠한 고려도 필요 없을 것이다. 또한, DIRECT LOADING을 수행하는 경우 단일 테이블에는 하나의 DIRECT LOADING 만을 수행할 수 있다. 하지만, 파티션 테이블에는 각각의 파티션 테이블에 DIRECT LOADING을 수행할 수 있게 되며 이 경우에 로컬 인덱스로 인덱스를 구성해야만 테이블 파티션 별로 DIRECT LOADING 작업이 가능해 진다.

 

로컬 인덱스는 이와 같은 장점을 가지게 된다. 이처럼 독립된 작업과 보관 주기의 관리를 위해서는 우리는 로컬 인덱스를 선택해야 할 것이다. 이에 비해 글로벌 인덱스는 반대의 개념을 가진다. 다음 호에서는 글로벌 인덱스에 대해 자세히 확인해 보자.