본문 바로가기

Oracle

대용량 테이블 Migration 전략 (Exchange, Parallel Processing) 기본 카테고리

대용량 테이블 Migration 전략 (Exchange, Parallel Processing) 기본 카테고리

http://www.dator.co.kr/?mid=textyle&category=91088&vid=enda&document_srl=91237


Exchange는 Partitioned Table의 특정 Partition과 일반 Non-Partitioned Table간의 구조를 서로 바꾸는 것으로 대용량의 Partitioned Table을 Managing하는데 상당한 효과가 있다.

위의 그림에서 보면 데이터가 없는 New Data Table과 데이터가 들어 있는 Partition2가 Exchange를 하게 되면 Partition2에 해당하는 Dictionary정보가 New Data로 바뀌게 되므로 New Data 테이블에는 데이터가 있게 되고, Partition2에는 데이터가 없게 된다. 이 것은 실제로 데이터가 이동하는 것이 아니라 데이터를 저장하는 Table의 정보만 Update되는 것으로 Tablespace를 옮겨야 하는등의 실제 물리적인 데이터 이동시에는 사용할 수가 없다.
주의 점은 Exchange하고자 하는 Partition과 Table의 구조가 같아야 하고 속성들의 특성들이 같아야 한다.

기본적인 Syntax는 다음과 같다.

Alter table Tb_Partition
Exchange partition par_200306 
With table Tb_Exchange
(Without validation Including indexes)


1. Split시

대용량의 Partitioned Table을 Split하게 되면 많은 시간이 걸리게 된다. 이럴 때 Exchange방법을 이용하면 빠르고 안전하게 할 수 있다.

위의 그림에서 알 수 있듯이 Split을 해야 하는 Partition을 Exchange에 의해 빈 공간으로 만든 다음 Split을 하고 다시 데이터를 채우기 위해 Split을 하는 것이다. 이렇게 하면 대용량의 데이터임에도 불구하고 아주 빠른 시간내에 Split작업을 할 수 있다.

2.  동일 테이블 생성

대부분의 DBA들과 개발자들은 동일 Table을 생성할 때 Create Table ~ as select 구문을 이용하게 된다. 대용량의 데이터일 경우 Parallel 옵션을 주어 생성하기도 한다.  만약 1억건의 테이블을 그대로 생성한다고 할 때 어떤 방법이 있을까? 이렇게 대용량의 Partitioned Table을 생성시 Exchange, Program Parallel 방법을 쓰면 아주 안전하고 빠르게 생성할 수가 있다. 다음 그림을 살펴보자.

먼저 생성할 TB_PART_1 테이블을 빈 껍데기만 만들어 놓는다.
대용량의 Partitioned Table의 Partition각각을 Create table ~ as select 구문의 Parallel 옵션을 이용하여 각각의 Table로 생성한다. 그 이후 미리 생성해 놓은 TB_PART_1 테이블의 Partition과 만들어 놓은 테이블들을 Exchange하는 것이다. 이때 파티션별로 200105.sql, 200106.sql, 200107.sql……….. 이렇게 만들어 놓고 이 프로그램들을 동시에 돌리게 되면 (Program Parallel) 극적인 효과를 볼 수 있다. 이런 대용량의 작업시에는 시스템 자원(CPU, MEMORY)등을 모니터링 하면서 작업을 해야 안전하게 할 수 있다.

3. 데이터 Migration시 (리모트에서 데이터를 옮길때)

데이터를 Remote에서 옮겨야 할 때 보통 Database Link를 이용하게 되는데, Network을 통한 데이터 이동시에는 Serial하게 데이터가 이동되므로 속도의 현저한 저하가 나타나게 된다. 이 경우 Source table을 Partitioning하고 해당 Partition을 Access하는 Program을 각각 띠워 Parallel Processing을 하게되면 놀라운 속도 향상을 볼 수 있다.
Source Table을 Partitioning할 수 있는 상황이라면 Table의 분포를 보고 Range, List등으로 Partitioning을 할 수 있고 일정한 분포가 존재 하지 않는 Table일 경우는 Hash Partiitoing을 하여 분포도를 고르게 나눈 다음 해당 Partition을 읽는 View를 Access하여 데이터를 옮긴다.

 

4. Partitioned Index의 생성과 Rebuild시

 

인덱스 생성은 전체 데이터에 대해서 해당 컬럼의 Value로 Sorting을 하기 때문에 대용량의 테이블인 경우 Create, Reuild시 많은 시간이 필요하게 된다. Partitioned Index를 만들게 되면 Index의 생성 및 관리를 보다 효율적으로 할 수 있게 된다.

l        인덱스의 생성 절차

Ø         Partitioned 인덱스를 Unusable로 생성 (Local, Global Partitioned Index)


CREATE INDEX EMP_IDX1 ON EMP (DEPTNO)

GLOBAL

PARTITION BY RANGE (DEPTNO)

(PARTITION PAR_10 VALUES LESS THAN (‘20’) TABLESPACE TBS1,

PARTITION PAR_20 VALUES LESS THAN (‘30’) TABLESPACE TBS2,

PARTITION PAR_30 VALUES LESS THAN (‘40’) TABLESPACE TBS3,

PARTITION PAR_40 VALUES LESS THAN (‘50’) TABLESPACE TBS4,

PARTITION PAR_MAX VALUES LESS THAN (MAXVALUE) TABLESPACE TBS5)

UNUSABLE;

 
Ø         Partition별 Parallel Rebuild (index1.sql, index2.sql ….을 독립적으로 수행)


ALTER INDEX EMP_IDX1 REBUILD PARTITION PAR_10 PARALLEL 4;   ---à index1.sql

ALTER INDEX EMP_IDX1 REBUILD PARTITION PAR_20 PARALLEL 4;   ---à index2.sql

ALTER INDEX EMP_IDX1 REBUILD PARTITION PAR_30 PARALLEL 4;   ---à index3.sql

ALTER INDEX EMP_IDX1 REBUILD PARTITION PAR_40 PARALLEL 4;   ---à index4.sql

ALTER INDEX EMP_IDX1 REBUILD PARTITION PAR_MAX PARALLEL 4; ---à index5.sql