엑시엄이 보는 DB 세상
Large Object - LOB의 저장방식 및 사용법 1 0 99,999+

by axiom Large Object LOB CLOB BLOB NCLOB BFILE [2014.06.23]


대용량 데이터를 처리하기 위해 Oracle 8i부터 대용량 데이터를 저장하기 위한 LOB(Large Object) 타입이 등장했다. LOB 타입 등장 이전에는 대용량 데이터가 LONG 타입으로 처리됐으며 LONG 타입은 한 테이블에 단지 하나의 컬럼만 사용할 수 있었다.

또한 검색구현도 어려웠으며 저장 최대 크기도 2GB로 제한적이었다. 이에 비해 LOB 타입은 하나의 컬럼에 여러 개의 LOB 타입을 사용할 수 있으며 검색의 구현도 쉬워졌고 저장 크기 또한 4GB까지 지원하게 됐다.

이렇게 대용량 데이터 관리에 있어서 LOB 타입은 매우 유용해 보이지만, 대부분의 관리자들은 일반 데이터와 다른 LOB 타입 데이터의 사용 및 관리에 대해 많은 불편과 어려움을 호소하는 게 사실이다.

따라서 이 글에서는 LOB 타입 데이터를 좀더 손쉽게 업무에 이용할 수 있도록 LOB 타입의 저장방식과 사용법을 살펴본다. LOB 데이터 타입에는 네 가지 종류가 있으며 각각의 저장방식은 [표 1]과 같다.

  • [표1] LOB 데이터 타입의 네 가지 종류
  • 종류 파일 저장방식
    BLOB Internal 바이너리 데이터 저장 (최대 4G 저장)
    컴퓨터가 인식하는 모든 파일 기록 예)음석,화상,이미지등
    CLOB Internal Single-byte character data 저장(최대 4G 저장)
    텍스트 데이터 저장
    NCLOB Internal Multi-byte character data 저장(최대 4G 저장)
    NCHAR data와 같은 national character set(9i 이상 유니코드) 저장
    BFILE External(OS) OS 파일에 저장된 데이터의 포인터 저장 (최대 4G 저장)
    READ ONLY

LOB 타입 데이터의 기본적인 사용법은 [리스트 1]과 같다

  • [리스트 1] LOB 데이터의 기본적인 사용법
  • -- LOB 타입 컬럼을 포함한 테이블 생성
    -- 제약사항 : LOB 타입 컬럼을 cluster key로 사용하는 클러스터 테이블 생성 불가
    CREATE TABLE LOB_TEST
     (ID NUMBER,
      CLOB CLOB, --CLOB
      BLOB BLOB, --BLOB
      NCLOB NCLOB, --NCLOB
      BFILE BFILE) --BFILE ;
      
    
    -- LOB 데이터 저장
    INSERT INTO LOB_TEST
           VALUES(1
                 ,'AXIOM' -- CLOB
                 ,UTL_RAW.CAST_TO_RAW('Hello') --BLOB
                 ,'엑시엄' --NCLOB
                 ,BFILENAME(null,null));
    -- BFILENAME('경로or디렉토리객체명','파일명'))
    
    
    -- LOB 데이터 조회
    -- 일반 조회(컬럼 내용 중 일부는 조회되지 않음)
    SELECT * FROM LOB_TEST;
    
         ID CLOB     BLOB       NCLOB  BFILE
    ------- -------- ---------- ------ -----------------
          1 AXIOM    48656C6C6F 엑시엄  bfilename(NULL)
    
    
    
    -- 컬럼 길이 조회
    SELECT ID
           ,DBMS_LOB.GETLENGTH(CLOB) CLOB
           ,DBMS_LOB.GETLENGTH(BLOB) BLOB
           ,DBMS_LOB.GETLENGTH(NCLOB) NCLOB
           ,DBMS_LOB.GETLENGTH(BFILE) BFILE
     FROM LOB_TEST;
     
         ID       CLOB       BLOB      NCLOB      BFILE
    ------ ---------- ---------- ---------- ----------
         1          5          5          3
    
    

제시한 내용뿐 아니라 LOB 타입 데이터의 생성, DML, 조회에 대한 다양한 사용법이 존재하지만 여기까지만 살펴보고, 이어서 LOB 타입 데이터를 포함하고 있는 테이블 이관 시 주의해야 할 사항을 설명한다.

만약 LOB 타입을 포함하고 있는 테이블이 대용량이고 Archive log mode라면 archive log file의 생성이 기하급수적으로 늘어나게 되어 종종 곤란을 겪을 수 있다. 이러한 경우 Redo log를 쓰지 못하도록 설정해 이관해야 하는데 다음의 이관 방법에 이 내용을 적용해 보기로 하자.

우선 데이터 이관 방법으로 CTAS와 export/import가 주로 사용된다. CTAS는 테이블 단위로 Local이나 Remote에서 간단한 명령어로 데이터를 이관할 수 있지만, 네트워크 속도에 따라 작업 속도의 차이가 나타난다.

export/import는 이관 대상 데이터에 대해 일괄 export해서 타겟 데이터베이스에 import하는 방식이다. Oracle 10g에서는 data pump 개념이 등장해 export/ import에 비해서도 작업이 훨씬 수월해졌다. 그럼 각각의 사용법을 살펴보자.

CTAS

1) 이관 대상 테이블과 동일한 타겟 테이블 레이아웃 생성 (주의 : DEFAULT 값이 설정되어 있으면, 아래의 방법으로 테이블 생성 시 적용되지 않으므로 수동 적용해야 함)

CREATE TABLE TOBE_TEST -- 타겟 테이블
AS
SELECT * 
  FROM ASIS_TEST -- 이관대상 테이블명
 WHERE 1=2;

2) 타겟 테이블에 데이터 저장

ALTER TABLE TOBE_TEST NOLOGGING; 
ALTER SESSION ENABLE PARALLEL DML; 
INSERT /*+ APPEND */ INTO TOBE_TEST
SELECT /*+ PARALLEL(A 8) */ * FROM ASIS_TEST A;

이와 같이 CTAS 사용시 다양한 설정을 통해 이관 속도를 단축시킬 수 있다. LOB 타입 데이터는 데이터 이관시 많은 양의 로그로 인한 DISK FULL 현상에 각별히 주의해야 하는데 NOLOGGING 옵션을 통해 작업에 대한 REDO 로그를 최소한으로 생성되게 함으로써 DISK I/O 부하 및 대량의 로그 기록으로 인한 시간을 단축시킨다.

또한 PARALLEL 설정을 통해 SELECT시 분산 작업이 가능하게 함으로써 작업시간을 단축시키며, DIRECT LOAD(APPEND)를 통해 INSERT시 현재 세그먼트의 FREE BLOCK을 무시하고 HWM뒤에 WRITE함으로써 작업시간을 단축시킨다.

Data Pump(expdp/impdp)

1) DATA PUMP 사용을 위한 디렉터리 객체 생성

CREATE DIRECTORY DMPDIR AS 'C:\DUMP';

2) expdp 유틸리티를 이용한 대상 백업

expdp system/*** directory=dmpdir tables=asis_test dumpfile= exp.dmp logfile=exp.log

-- EXP에는 FULL/SCHEMEA/TABLE 단위로 백업 가능

3) impdp 유틸리티를 이용한 대상 이관

CREATE TABLE TOBE_TEST NOLOGGING -- 타겟 테이블명
AS 
SELECT * FROM ASIS_TEST -- 이관대상 테이블명
WHERE 1=2;

impdp system/**** directory=dmpdir dumpfile=exp.dmp logfile=imp.log content=data_only

LOB 컬럼을 포함하고 있는 데이터 이관시 IMPDP 작업 전 NOLOGGING 옵션을 적용한 타겟 테이블을 미리 생성해 놓고, IMPDP 시에 데이터만 INSERT함으로써 대량의 데이터에 의한 로그 생성을 줄여야 한다.

이렇듯 LOB 타입 데이터는 대용량의 데이터를 저장할 수 있는 장점이 있는 반면, 사용 시에는 일반적인 컬럼과 다르게 주의해야 할 사항들이 존재한다. 이점만 기억하고 주의해서 사용한다면 LOB 타입과 좀더 친숙해질 수 있을 것이라고 확신한다.

- 강좌 URL : http://www.gurubee.net/lecture/2768

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입