Admin/admin

온라인 재정의를 통한 LONG -> LOB 변환

Qhtlr 2007. 9. 4. 14:32

운영중인 데이터 웨어하우스에 많은 양의 텍스트 데이터가 입력되어 있는 환경에서는, LONG 데이터타입을 갖는 컬럼이 여럿 존재할 가능성이 높습니다.
LONG 데이터타입은 SUBSTR과 같은 데이터 처리 함수에서 활용될 수 없다는 단점이 있으며, 따라서 LOB 컬럼으로 변환하는 것이 바람직합니다.

DBMS_REDEFINITION 패키지를 이용하면 온라인 상태에서 LONG 데이터타입을 LOB 데이터타입으로 변환할 수 있습니다. 하지만 Oracle Database 10g Release 2 이전 버전에는 중요한 제약사항이 존재했습니다.

LONG 컬럼을 LOB 컬럼으로 변환하는 작업은 최대한 신속하게 완료되어야 합니다. 테이블이 파티셔닝되어 있는 경우, 프로세스는 각 파티션 별로 병렬적으로 수행됩니다. 하지만 테이블이 파티셔닝되어 있지 않다면, 모든 작업은 순차적으로 수행되며 따라서 매우 오랜 시간이 걸릴 수 있습니다.

Oracle Database 10g Release 2는 파티셔닝되어 있지 않은 테이블에 대해서도 LONG->LOB 변환 작업을 병렬적으로 수행합니다. 예를 들어 설명해 보기로 하겠습니다. 고객에게 전송할 이메일 메시지를 저장한 테이블이 있습니다. 메시지 본문의 저장에 사용되는 MESG_TEXT 컬럼은 매우 긴 텍스트를 포함하므로, 이 컬럼은 LONG 데이터타입으로 정의되었습니다.
SQL> desc acc_mesg
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------

 ACC_NO                                    NOT NULL NUMBER
 MESG_DT                                   NOT NULL DATE
 MESG_TEXT                                          LONG
이 컬럼을 CLOB 데이터타입으로 변환하려 합니다. 먼저, 마지막 컬럼(CLOB 데이터타입)을 제외하고는 동일한 구조를 갖는 임시 테이블을 생성합니다:
create table ACC_MESG_INT
(
   acc_no   number,
   mesg_dt  date,
   mesg_text clob
);
이제 재정의 작업을 시작합니다.
  1  begin
  2     dbms_redefinition.start_redef_table (
  3        UNAME        => 'ARUP',
  4        ORIG_TABLE   => 'ACC_MESG',
  5        INT_TABLE    => 'ACC_MESG_INT',
  6        COL_MAPPING  => 'acc_no acc_no, mesg_dt mesg_dt, to_lob(MESG_TEXT) MESG_TEXT'
  7  );
  8* end;
6번째 라인에서, 컬럼이 매핑되는 과정을 주목하시기 바랍니다. 처음 두 컬럼에는 아무런 변화가 없지만 세 번째 MESG_TEXT 컬럼은 소스 테이블 컬럼에 TO_LOB 함수를 적용한 후 타겟 테이블의 MESG_TEXT 컬럼으로 변환하도록 정의되어 있습니다. 테이블의 사이즈가 큰 경우에는, 소스 테이블과 타겟 테이블을 정기적으로 동기화시켜 주어야 합니다. 이렇게 해 두면 최종적인 동기화 작업을 훨씬 빨리 끝낼 수 있습니다.
begin
    dbms_redefinition.sync_interim_table( 
        uname      => 'ARUP',  
        orig_table => 'ACC_MESG', 
        int_table  => 'ACC_MESG_INT'
    );
end;
/
위 커맨드의 실행시간은 테이블의 사이즈에 따라 크게 달라질 수 있습니다. 마지막으로, 아래와 같이 재정의 작업을 마무리합니다:
begin
   dbms_redefinition.finish_redef_table (
      UNAME        => 'ARUP',
      ORIG_TABLE   => 'ACC_MESG',
      INT_TABLE    => 'ACC_MESG_INT'
);
end;
/
ACC_MESG 테이블이 다음과 같이 변경되었습니다:
SQL> desc acc_mesg
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------

 ACC_NO                                    NOT NULL NUMBER
 MESG_DT                                   NOT NULL DATE
 MESG_TEXT
MESG_TEXT 컬럼은 이제 LONG 대신 CLOB 데이터타입으로 구성되었습니다. 이 기능은 잘못 정의된 테이블, 또는 레거시 테이블을 변환하는 경우에 매우 유용하게 활용됩니다.

출처:오라클