LOB STORAGE의 STORAGE IN ROW 옵션

2013. 2. 16. 13:54데이터전환

Inline and Out-of-Line LOB Storage

LOB 컬럼은 실제 LOB 값의 저장위치를 가리키는 로케이터(locator)를 저장한다. 하지만 테이블 생성시 storage in row 옵션, 또는 LOB 값의 크기에 따라서 실제 LOB의 값이 테이블 블록의 로우 안(inline)에 저장되거나 아예 테이블 블록 바깥에 다시 말해서 별도의CLOB 블록에(out-of-line)에 저장되기도 한다.

아래와 같은 조건이 되면 LOB 값은 CLOB 블록에 저장된다.

1. 테이블 생성시 LOB storage 절에 DISABLE STORAGE IN ROW 로 명시하는 경우

2. LOB 값의 크기가 근사적으로 4000 바이트(4000 - 시스템 제어 정보)보다 큰 경우

3. CLOB 블록에 저장된 LOB값을 4000 바이트 보다 작은 값으로 update 하더라도 그대로 CLOB 블록에 저장

테이블 생성시 CLOB 컬럼의  STORAGE 옵션과 테이블스페이스

 CREATE TABLE ORACLE.T1
(
    A1       CHAR(24) NOT NULL,
    A2       VARCHAR2(14) DEFAULT TO_CHAR(SYSDATE,'YYYYMMDDHH24MISS'),
    A3       VARCHAR2(10),
    A4       VARCHAR2(3),
    A5       VARCHAR2(13),
    A6       CLOB
)
TABLESPACE TABLE_TS
NOCOMPRESS
LOB (A6) STORE AS
(
    TABLESPACE CLOB_TS
    DISABLE STORAGE IN ROW
    STORAGE
    (
        INITIAL 64K
    )
    CHUNK 8192
    RETENTION
);

아래는 테이블 블록의 테이블스페이스와 다른 CLOB 블록의 테이블스페이스를 명시적으로 주는 경우 또는 DISABLE STORAGE IN ROW 옵션을 명시적으로 주는 경우를 구분하여 테스트한 결과에 대한 표임

TABLE TABLESPACE 

 CLOB TABLESPACE

 CLOB OPTION

 TABLE BLOCKS

 CLOB BLOCKS

 TOTAL BLOCKS
 TABLE_TS

 TABLE_TS

 없는 경우

 1728896  642824

 2371720

 TABLE_TS

 CLOB_TS 

DISABLE STORAGE IN ROW

 33792  6019456  6053248
 TABLE_TS  TABLE_TS   없는 경우

 1736704

 645128

 2381832

 TABLE_TS

 CLOB_TS

DISABLE STORAGE IN ROW

 33792  6027776  6061568

 

테이블 블록의 테이블스페이스와 CLOB 블록의 테이블스페이스를 동일하게 설정하든 안하든, DISABLE STORAGE IN ROW 옵션이 없는 경우(CLOB값의 크기에 따라 테이블 블록에도 저장이 가능한 경우)에는 테이블 블록의 개수가 많은 것을 확인할 수 있다. 응답 시간이 중요한 웹 또는 CLOB 값을 제외한 나머지 컬럼에 대한 조회, 또는 DML 작업이 많은 경우에 불필요한 CLOB 블록까지 버퍼 캐시로 로드하여 액세스하므로 속도의 저하가 예상된다.

 

DISABLE STORAGE IN ROW 옵션이 설정된 경우에는 TABLE BLOCK의 개수가 현저하게 작고 모든 CLOB 값이 CLOB 테이블스페이스에 저장되는 것을 확인할 수 있다. 웹처럼 응답시간이 중요하고 CLOB값은 조회되는 경우가 훨씬 적은 경우에는 CLOB을 별도의 테이블스페이스에 저장하여 응답시간 및 DML 작업을 신속하게 진행할 수 있다. 하지만 CLOB 블록의 개수가 현저하게 늘어나는 단점이 있으므로 초기 이행시 부하가 예상된다.

그러므로 CLOB 테이블스페이스를 별도의 디스크 스토리지로 분산하고 캐시를 이용한다면 단점을 많이 커버할 수 있다.