LOB 데이터 타입
LOB 데이터 타입#
개요#
LOB(Large Object) 데이터 타입은 대용량 데이터를 저장할 수 있는 데이터 타입이다. 하나의 LOB컬럼에 저장 가능한 데이터의 크기는 최대 4 GB - 1 byte 이다. 테이블을 생성할 때 다른 타입들과 달리 사용자가 LOB 컬럼의 크기를 명시할 필요가 없다. 그리고 하나의 테이블에 하나 이상의 LOB 타입 컬럼을 정의할 수 있다.
LOB 데이터 타입은 이미지, 동영상 파일들과 같은 이진 데이터를 저장하는 BLOB(Binary Large Object)과 문자열 데이터를 저장하는 CLOB(Character Large Object)으로 구분된다.
Altibase LOB의 특징#
Altibase가 제공하는 LOB은 다음과 같은 특징이 있다.
- 데이터 저장 기능
- 부분 읽기(Partial Read)
- 디스크 LOB 파티셔닝
데이터 저장 기능#
ODBC의 SQLPutLob 함수 또는 JDBC의 setBlob 또는 setClob 메소드를 이용하여 CLOB, BLOB 데이터를 저장할 수 있다.
부분 읽기(Partial Read)#
LOB 데이터의 특정 구간에 대한 데이터 조각을 읽는 기능이다. Altibase ODBC의 SQLGetLob 함수를 이용하여 특정 오프셋의 크기를 읽는다.
디스크 LOB의 파티셔닝#
디스크 LOB 데이터는 테이블이 속한 테이블스페이스가 아닌 다른 디스크 테이블스페이스로 저장이 가능하다. 이는 테이블 파티셔닝 방법과 유사하다.
LOB 컬럼의 저장#
LOB 데이터는 대부분의 경우 레코드 영역 밖의 가변 영역에 저장된다. 또한 LOB 컬럼의 크기가 크지 않을 때에는 in row 옵션을 사용하여 레코드 영역(고정 영역) 안에 저장하기도 한다. 그러나 디스크 테이블의 LOB 데이터는 크기와 상관없이 항상 가변 영역에 저장된다.
가변 영역에 저장되는 LOB 컬럼의 데이터는 크기가 매우 크기 때문에, 레코드의 나머지가 속하는 테이블스페이스에 같이 저장되는 것은 공간 사용 측면에서 효율성이 떨어진다.
디스크 테이블의 경우 LOB 컬럼 데이터를 LOB 컬럼이 속한 테이블과 별도의 테이블스페이스에 저장할 수 있다. 그러나 메모리 테이블의 경우에는 LOB 컬럼 데이터를 별도로 저장할 수 없고 테이블과 동일한 테이블스페이스에만 저장할 수 있다.
BLOB#
흐름도#
구문#
BLOB [ IN ROW size ]
설명#
BLOB은 이진형 대용량 데이터를 저장하기 위한 이진형 데이터 타입으로, 4 GB - 1 byte 크기까지 저장 가능하다.
IN ROW 절에 대한 자세한 설명은 앞서 기술한 "IN ROW 절"을 참고한다.
CLOB#
흐름도#
구문#
CLOB [ IN ROW size ]
설명#
CLOB은 문자형 대용량 데이터를 저장하기 위한 문자형 데이터 타입으로, 4 GB - 1 byte 크기까지 저장 가능하다.
IN ROW 절에 대한 자세한 설명은 앞서 기술한 "IN ROW 절"을 참고한다.
Temporary LOB#
Temporary LOB 은 대규모 텍스트 또는 바이너리 데이터를 처리하기 위해 사용되는 임시 LOB 이다. TEMPORARY_LOB_ENABLE 프로퍼티를 1로 설정하여 Temporary LOB을 사용할 수 있다. 현재 사용중인 Temporary LOB의 정보는 V$TEMPORARY_LOBS를 통해 조회할 수 있다.
특징#
- 실행시점(Execution)에 메모리 영역에 Temporary LOB이 생성된다.
- 특정 세션이나 트랜잭션 동안에만 존재하며, 해당 세션 또는 트랜잭션이 종료되면 자동으로 삭제된다.
Temporary LOB 유형#
Temporary LOB 의 유형 별 설명은 아래의 표를 참고한다.
-
트랜잭션 Temporary LOB: 트랜잭션 생명주기에 의존적인 Temporary LOB
-
세션 Temporary LOB : 세션 생명주기에 의존적인 Temporary LOB
비교 | 트랜잭션 Temporary LOB | 세션 Temporary LOB |
---|---|---|
생명주기 | 트랜잭션 | 세션 |
정리시점 | 트랜잭션 종료시 정리 | - 세션 종료 시 정리- ALTER SESSION SET FREE TEMPORARY LOB 구문으로 정리 |
사용법 | 세션 Temporary LOB이 생성되는 경우를 제외한 모든 구문에서 다음과 같이 사용한 경우- TO_CLOB- TO_BLOB- CLOB 을 인자로 받는 SUBSTR- CLOB 을 인자로 받는 CONCAT- PSM 내에서 LOB 타입의 변수 | PSM 내에서 아래의 유형으로 LOB 타입을 사용한 경우- ASSOCIATIVE ARRAY- VARRAY- PACKAGE 변수 |
예제 - 트랜잭션 Temporary LOB#
iSQL> CREATE TABLE t1(c1 CLOB);
Create success.
iSQL> AUTOCOMMIT OFF;
Set autocommit off success.
iSQL> INSERT INTO t1 VALUES (TO_CLOB('ABCD'));
1 row inserted.
iSQL> SELECT TYPE, OPEN_COUNT FROM V$TEMPORARY_LOBS;
TYPE OPEN_COUNT
---------------------------------------------
0 1
1 row selected.
iSQL> COMMIT;
Commit success.
iSQL> SELECT TYPE, OPEN_COUNT FROM V$TEMPORARY_LOBS;
TYPE OPEN_COUNT
---------------------------------------------
No rows selected.
예제 - 세션 Temporary LOB#
iSQL> CREATE OR REPLACE PACKAGE pkg1
2 AS
3 V1 CLOB;
4 PROCEDURE PROC1;
5 END;
6 /
Create success.
iSQL> CREATE OR REPLACE PACKAGE BODY pkg1
2 AS
3 PROCEDURE proc1
4 AS
5 V2 CLOB;
6 BEGIN
7 V1 := 'pkg spec session clob';
8 V2 := 'pkg body session clob';
9 PRINTLN(V1);
10 PRINTLN(V2);
11 END;
12 END;
13 /
Create success.
iSQL> SELECT TYPE, OPEN_COUNT FROM V$TEMPORARY_LOBS;
TYPE OPEN_COUNT
---------------------------------------------
No rows selected.
iSQL> EXEC pkg1.proc1;
pkg spec session clob
pkg body session clob
Execute success.
iSQL> SELECT TYPE, OPEN_COUNT FROM V$TEMPORARY_LOBS;
TYPE OPEN_COUNT
---------------------------------------------
1 2
1 row selected.
-- 현재 세션에서 세션 Temporary LOB을 정리
iSQL> ALTER SESSION SET FREE TEMPORARY LOB;
Alter success.
iSQL> SELECT TYPE, OPEN_COUNT FROM V$TEMPORARY_LOBS;
MANAGER_TYPE OPEN_COUNT
---------------------------------------------
No rows selected.
제한사항#
- 커서에서 LOB 타입 컬럼을 사용할 수 없다.
- 휘발성 테이블스페이스 또는 디스크 임시 테이블스페이스에 LOB 타입 컬럼을 사용할 수 없다.
- 폐기된 테이블스페이스의 LOB 타입 컬럼은 접근할 수 없다.
- 파티션 키 컬럼은 대소 비교가 가능해야 하기 때문에 LOB 타입 컬럼은 파티션 키 컬럼으로 사용될 수 없다.
- LOB 타입 컬럼에는 인덱스를 생성할 수 없다.