LOB SEGMENT 관리
일반 테이블의 lob segment 관리.
- Lob 컬럼이 존재하는 table을 옮기고자 할때는 테이블만을 옮긴다고 해서 lob column까지 옮겨지는 것은 아니다. Lob column의 테이블 스페이스와 테이블의 테이블스페이스는 별개로 생각해야한다.
아래와 같은 CLOB을 가지는 테이블이 있다고 하자.
Lob 테이블 생성
CREATE TABLE DTXGCD ( DTXGCD_SQ NUMBER NOT NULL, DTXGCD_BRND_NM VARCHAR2 (50), DTXGCD_ADTK_URL VARCHAR2 (255), DTXGCD_BRF_BNFT_IF VARCHAR2 (512), DTXGCD_DTL_BNFT_IF CLOB ) tablespace pak pctfree 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 5M MINEXTENTS 1 MAXEXTENTS UNLIMITED BUFFER_POOL DEFAULT ) lob (DTXGCD_DTL_BNFT_IF) store as L_DTXGCD_DTL_BNFT_IF ( tablespace pak storage(initial 3M) index X_DTXGCD_DTL_BNFT_IF (tablespace pak_idx storage(initial 1M) )); insert into DTXGCD values(1,'a','a','a','a'); |
생성구문을 자세히 보면 테이블 DTXGCD는 PAK테이블 스페이스에 생성하였고, DTXGCD_DTL_BNFT_IF이름의
CLOB컬럼은 L_DTXGCD_DTL_BNFT_IF 라는 이름으로 PAK테이블 스페이스에 생성되었다.
CLOB인덱스는 X_DTXGCD_DTL_BNFT_IF란 이름으로 PAK테이블 스페이스에 생성되었다.
LOBINDEX는 LOBSEGMENT의 테이블스페이스와 동일한 테이블 스페이스에 생성된다.
결과를 확인하기 위해서 조회를 하면 <그림-1>과 같다.
<그림-1>
select segment_name,segment_type,tablespace_name from dba_segments … SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME ------------------------------ ------------------ ------------------------------ DTXGCD TABLE PAK X_DTXGCD_DTL_BNFT_IF LOBINDEX PAK L_DTXGCD_DTL_BNFT_IF LOBSEGMENT PAK
|
테이블 이동
일반적인 방법 alter table.. move로 테이블을 옮겨보자.
<그림 -2>
alter table DTXGCD move tablespace users;
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME ------------------------------ ------------------ ----------------- X_DTXGCD_DTL_BNFT_IF LOBINDEX PAK L_DTXGCD_DTL_BNFT_IF LOBSEGMENT PAK DTXGCD TABLE USERS
|
<그림-2>와 같이 테이블을 이동하였을 경우 테이블은 users라는 테이블 스페이스로 이동되었지만 lob인덱스와 lob컬럼(세그먼트)는 여전히 PAK테이블 스페이스에 존재한다.
Lob index, lob segment 이동
lob index와lob segment를 이동시키는 방법은 아래와 같다.(lobindex와lobsegment를 각각 다른테이블
스페스페이 생성하는 것은 불가. lobsegment테이블스페이스위치에 lobindex생성됨)
ALTER TABLE DTXGCD MOVE LOB(DTXGCD_DTL_BNFT_IF) STORE AS L_DTXGCD_DTL_BNFT_IF
(TABLESPACE users STORAGE (initial 2M));
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
--------------------------- ------------------ ------------------
L_DTXGCD_DTL_BNFT_IF LOBSEGMENT USERS
X_DTXGCD_DTL_BNFT_IF LOBINDEX USERS
DTXGCD TABLE USERS
테이블과 lobsegment,lobindex 이동
테이블과 lobsegment를 한번에 이동하는 명령은 아래와 같다.
alter table DTXGCD move lob(DTXGCD_DTL_BNFT_IF) store as
(tablespace users storage ( initial 3m next 2m) )
storage ( initial 3m next 2m)
tablespace users ;
lob segment를 포함하는 파티셔닝테이블의 이동
이번에는 lob segment를 포함하는 파티셔닝테이블의 이동에 대해서 알아보자.
생성
create table show_lob_storage (aaa number(5), bbb varchar2(10), ccc number(5), ddd CLOB ) PARTITION BY RANGE(aaa) (PARTITION p1 VALUES LESS THAN (50) tablespace part01 LOB (ddd) STORE AS L_DDD_50 (tablespace part01) , PARTITION p2 VALUES LESS THAN (100) tablespace part02 LOB (ddd) STORE AS L_DDD_100 (tablespace part02) , PARTITION p3 VALUES LESS THAN (MAXVALUE) tablespace part03 LOB (ddd) STORE AS L_DDD_MAX (tablespace part03) ) ; < LOB_PARTITION_NAME> - 세그먼트네임이아니라 랍파티션네임이다 |
생성스크립트에서 LOB(ddd) STORE AS 뒤에 오는 이름은 lobsegment이름이 아니라 lob_partition_name이라는
<그림-3>
select partition_name,lob_name,, lob_partition_name, tablespace_name from user_lob_partitions where table_name = 'SHOW_LOB_STORAGE';
PARTITION_NAME LOB_NAME LOB_PARTITION_NAME TABLESPACE_NAME ---------------- ---------------- --------------------- ----------------- P2 SYS_LOB0000105301C00004$$ L_DDD_50 PART01 P1 SYS_LOB0000105301C00004$$ L_DDD_100 PART02 P3 SYS_LOB0000105301C00004$$ L_DDD_MAX PART03 |
파티션과 랍세그먼트를 한번에 part02에서 part04로이동해보자
이때 주의 할점은 파티션을 이동할 때 , LOB_PARTITION_NAME은 기존이름과는 달리해줘야한다.
<그림-3>에서는 P1파티션의 LOB_PARTITION_NAME은 L_DDD_100였지만 <그림-4>에서 P1파티션의
LOB_PARTITION_NAME은 _DDD_PART4이다. (같은이름으로 지정시 에러발생)
<그림-4>
alter table SHOW_LOB_STORAGE move partition P1 tablespace PART04 lob(DDD) store as L_DDD_part4 (tablespace PART04);
PARTITION_NAME LOB_PARTITION_NAME TABLESPACE_NAME ------------------------------ --------------------- ----------------- P2 L_DDD_50 PART01 P1 L_DDD_PART4 PART04 P3 L_DDD_MAX PART03 |
랍세그먼트의 파티션을 이동하여도 인덱스는 unusable로 빠지지 않는다.
select partition_name, tablespace_name, status from user_ind_partitions;
출처: http://andwiz.tistory.com/entry/LOB-segment-관리 [(주)앤드위즈]