게시일: Dec 04, 2011 11:53:31 PM
지금 현재 사용하는 Oracle 11g에서도 LONG과 LONG RAW 타입을 지원하기는 하지만, 오라클사에서는 이제 더 이상 LONG이나 LONG RAW 타입의 사용을 배제하고 LOB 타입을 사용하라고 강력히 권고하고 있다. 현재까지 LONG 타입들을 지원하는 이유는 오직 하위버전과의 호환성 때문이며, 향후에는 이 두 타입이 사라질 것이라고 한다.
LONG과 LONG RAW에 대한 기억
LONG : 가변길이 문자 값을 의미하며 최대 2GB까지 저장 가능
LONG RAW : LONG과 같지만 바이너리(Binary) 데이터 타입니다.
이들 두 LONG 타입 대신에 LOB 타입을 사용해야 하는 이유...
① LONG이나 LONG RAW 타입은 테이블당 단 한 개의 컬럼의 데이터 타입으로만 사용이 가능하다.
하지만 LOB 타입은 여러 개의 컬럼의 데이터 타입으로 사용할 수 있다.
② LONG, LONG RAW의 최대 크기는 2GB인 반면 LOB 타입은 4GB까지 지원한다.
③ LONG 타입의 데이터들은 순차적으로만 접근이 가능하지만 LOB 타입은 랜덤(random)하게 접근할 수 있다.
④ LOB 컬럼을 가진 테이블의 데이터를 조회할 경우, 오라클은 해당 컬럼의 데이터 전체가 아닌 오직 LOB 로케이터(locator)만 조회한다.
-> 로케이터(locator) : 데이터가 실제로 저장되는 위치를 가리키는 포인터
따라서 일반적인 조회를 할 경우에 성능적인 면에서 큰 부가하 걸리지 않는다.
하지만 LONG 컬럼의 경우에는 데이터 전체가 조회된다.
극단적인 경우 쿼리를 실행할 때마다 한 로우마다 2GB의 데이터를 데이터 파일에서 메모리로 읽어올 수 있다.
⑤ LOB 타입 컬럼에 데이터를 저장할 때, 실제 LOB 값은 테이블에 있는 다른 컬럼의 데이터들과는 달리 독립적인 다른 세그먼트에 의해 저장되며
해당 로우에는 오직 LOB 로케이터만 저장된다.
- LOB 타입의 종류
ㅇ 내부(internal) LOB 타입
▷ CLOB 타입
- Character Large Object 타입
- 데이터베이스 단일 바이트(single-byte) 문자 셋으로 저장되며, 크기가 큰 문자열이나 문서의 저장이 가능하다.
- 기존의 LONG 타입이 확장된 형태로, 4GB까지 저장할 수 있다.
▷ BLOB 타입
- Binary Large Object 타입
- 바이너리 형태로 저장되며 사진, 비디오, 오디오 데이터 저장시 주로 사용된다.
- 기존의 LONG RAW 타입이 확장된 형태로, 4GB까지 저장할 수 있다.
▷ NCLOB 타입
- National Character Set Large Object 타입
- CLOB과 같으나 National Character Set으로 저장된다.
ㅇ 외부(external) LOB 타입
▷ BFILE 타입
- External Binary File 타입
- 오라클 외부 운영체제 파일 시스템에 저장되지만, 오라클 테이블에서 접근이 가능하다.
- 실제 데이터가 오라클 외부에 저장되기 때문에 오라클 자체에서는 트랜잭션 관리를 할 수 없다.
- 이 타입의 데이터는 오직 읽기만 가능하다.
- DVD나 CD와 같이 오라클 내부에 저장되기에는 부담이 너무 큰 비구조화된 데이터를 저장하는데 사용된다.
☞ 내부나 외부 LOB 타입 모두 테이블에는 로케이터 정보만 저장된다는 점은 같지만, 실제 데이터의 저장 위치는 다르다.
- LOB 로케이터와 값
모든 LOB 컬럼은 locator와 value로 구성된다.
LOB locator는 컬럼에 저장되는 LOB 컬럼의 실제 값의 위치를 가리키는 포인터를 말하며,
LOB 컬럼에 값을 저장하면 테이블에는 로케이터 정보가 저장되고,
실제 값은 내부 LOB의 경우에는 다른 세그먼트에, 외부 LOB의 경우에는 외부 파일로 저장된다.
따라서 LOB 컬럼을 가진 테이블을 SELECT 하면 실제 컬럼값이 아닌 로케이터 값이 조회된다.
LOB 타입의 데이터를 조작하는 데는 일반적인 SQL 이외에 PL/SQL이나 다른 프로그래밍 언어를 같이 사용해야 한다.
LOB 타입은 다음과 같은 세 가지 상태를 가지고 있다.
NULL : 맨 처음 생성되었을 때의 상태로 로케이터와 값이 모두 없는 상태
EMPTY : 로케이터만 있고 값이 없는 상태, lob 길이는 0
PERSISTANT : 로케이터와 값을 모두 가진 상태
EMPTY 상태는 LOB 로케이터만 있고 값은 없는 상태로, LOB 컬럼에 데이터를 넣기 전의 초기화된 상태를 말한다.
즉, 값이 들어가기 직전의 대기상태라고 할 수 있으며, 새로운 값을 저장하기 이전에 반드시 초기화 과정을 거쳐야 한다.
LOB 컬럼의 상태를 EMPTY 상태로 만드는 함수
① EMPTY_CLOB()
② EMPTY_BLOB()
③ BFILENAME('디렉토리명', '파일명')
첫 번째 인자인 디렉토리는 파일 시스템의 물리적인 디렉토리명이 아니라 오라클의 디렉토리 객체를 말한다.
ex) create or replace directory LOB_TEST as 'C:\LOB_TEST'; -- 물리적 위치(C:\LOB_TEST)를 LOB_TEST로 선언
insert into test (id, c_col, b_col, f_col) values (1, EMPTY_CLOB(), EMPTY_BLOB(), BFILENAME(LOB_TEST, 'MyTest.txt'));
- LOB 컬럼의 조작
1. 오라클에서는 LOB 컬럼을 조작하기 위한 용도로 DBMS_LOB 패키지를 제공하고 있다.
2. LENGTHB() : 해당 컬럼의 byte 수를 반환하는 SQL 함수이다.
ex) select id, lengthb(b_col) from test where id between 1 to 10;