www.onjprogramming.co.kr에 오시면 보다 다양한 강좌를 보실 수 있습니다.
Creating Tables with LOB Columns
테이블을 만들 때 하나 또는 여러 개의 LOB 컬럼을 만들 수가 있습니다.(LONG, LONG RAW는 테이블당 한 개만 지정 가능 했습니다.)
LOB 컬럼에 데이터를 저장 할 때 in-line 또는 out-of-line에서 저장 하느냐에 따라 다양한 옵션이 존재 합니다. 만약 in-line에서 데이터를 저장하는 것이 가능 하기 위해서는 4K 미만의 데이터만 저장이 가능 하다는 것을 명심해야 합니다.
LOB 컬럼을 포함하고 있는 테이블을 만들면 오라클은 각각의 LOB 컬럼에 대해 LOB Segment, LOB Index를 생성 합니다. Default로 LOB Segment와 LOB Index는 TABLE이 있는 테이블 스페이스에 만들어 집니다. 물론 별도의 테이블 스페이스를 지정 하는 것도 가능 합니다.
LOB Segment의 기본적인 이름은 SYS_LOBXXX(XXX는 16진수)이며 LOB Index의 이름은 SYS_ILXXX(XXX는 16진수) 입니다. 이때 Segment와 Index의 XXX 값은 일치 합니다.
아래에 LOB 컬럼을 가지는 테이블을 만들어 보았습니다.
SQL> CREATE TABLE test_lobtable (
2 id NUMBER
3 , xml_file CLOB
4 , image BLOB
5 , log_file BFILE
6 );
테이블이 생성되었습니다.
각각의 LOB 컬럼에 대해 오라클은 묵시적으로 LOB Segment와 LOB Index를 만드는데 이러한 정보는 View를 통해 확인 가능 합니다.( DBA_LOBS, ALL_LOBS, or USER_LOBS)
SQL> select table_name "TABLE" ,
2 column_name " COLUMN",
3 segment_name "SEGMENT",
4 index_name "INDEX"
5 from user_lobs
6 where table_name = UPPER('test_lobtable');
TABLE
------------------------------
COLUMN
----------------------------------------------------------------------------
SEGMENT INDEX
------------------------------ ------------------------------
TEST_LOBTABLE
XML_FILE
SYS_LOB0000030637C00002$$ SYS_IL0000030637C00002$$
TEST_LOBTABLE
IMAGE
SYS_LOB0000030637C00003$$ SYS_IL0000030637C00003$$
또한 USER_SEGMENTS 라는 VIEW를 통해 다음처럼 확인 하는 것도 가능 합니다.
SQL> col segment format a25
SQL> select segment_name "SEGMENT",
2 segment_type "TYPE",
3 tablespace_name "TABLESPACE"
4 from user_segments
5 where segment_name like 'SYS_LOB%'
6 or segment_name like 'SYS_IL%';
SEGMENT TYPE TABLESPACE
------------------------- ------------------ -----------------------
SYS_IL0000030407C00009$$ LOBINDEX SYSTEM
SYS_IL0000030416C00002$$ LOBINDEX SYSTEM
SYS_IL0000030637C00002$$ LOBINDEX SYSTEM
SYS_IL0000030637C00003$$ LOBINDEX SYSTEM
SYS_LOB0000030407C00009$$ LOBSEGMENT SYSTEM
SYS_LOB0000030416C00002$$ LOBSEGMENT SYSTEM
SYS_LOB0000030637C00002$$ LOBSEGMENT SYSTEM
SYS_LOB0000030637C00003$$ LOBSEGMENT SYSTEM
8 개의 행이 선택되었습니다.
------------------------
LOB 테이블 만들기 예
------------------------
아래는 기본 문법 입니다.
(column list)
[physical attributes]
[storage clause]
[LOB (<lobcol1> [, <lobcol2>...])
STORE AS
[<lob_segment_name>]
(
[TABLESPACE <tablespace_name>]
[{ENABLE | DISABLE} STORAGE IN ROW]
[CHUNK <chunk_size>]
[PCTVERSION <version_number>]
[ { CACHE | NO CACHE [{LOGGING | NOLOGGING}]
| CACHE READS [{LOGGING | NOLOGGING}]
}
]
[<storage_clause_for_LOB_segment>]
[INDEX [<lob_index_name>] [physical attributes] [<storage_for_LOB_index>] ]
)
]
[LOB (<lobcol1> [, <lobcol2>...]) ... ]
[예]
SQL>conn / as sysdba
SQL> create tablespace lob_data
2 datafile 'c:\oracle\oradata\wink\lob_data1.dbf'
3 size 500m
4 uniform size 8m;
테이블 영역이 생성되었습니다.
SQL>conn scott/tiger
SQL>CREATE TABLE test_lobtable (
id NUMBER ,
xml_file CLOB ,
image BLOB ,
log_file BFILE
)
LOB (xml_file)
STORE AS xml_file_lob_seg (
TABLESPACE lob_data
CHUNK 4096
CACHE
STORAGE (MINEXTENTS 2)
INDEX xml_file_lob_idx (
TABLESPACE lob_index
STORAGE (MAXEXTENTS UNLIMITED)
)
)
LOB (image)
STORE AS image_lob_seg (
TABLESPACE lob_data
ENABLE STORAGE IN ROW
CHUNK 4096
CACHE
STORAGE (MINEXTENTS 2)
INDEX image_lob_idx (
TABLESPACE lob_index
)
)
테이블이 생성되었습니다.
user_lobs 와 user_segments 뷰를 통해 결과를 확인 합니다.
SELECT
table_name "Table",
column_name "Column",
segment_name "Segment"
index_name "Index"
FROM user_lobs
WHERE table_name = 'TEST_LOBTABLE';
Table Column Segment Index
-------------- --------- ----------------- -----------------
TEST_LOBTABLE XML_FILE XML_FILE_LOB_SEG XML_FILE_LOB_IDX
TEST_LOBTABLE IMAGE IMAGE_LOB_SEG IMAGE_LOB_IDX
SELECT
segment_name "Segment"
, segment_type "Type"
, tablespace_name "Tablespace"
FROM user_segments
WHERE segment_name like 'XML_%'
OR segment_name like 'IMAGE_%'
ORDER BY segment_name DESC;
Segment TS Type Tablespace
------------------ ------------ -----------
XML_FILE_LOB_SEG LOBSEGMENT LOB_DATA
XML_FILE_LOB_IDX LOBINDEX LOB_DATA
IMAGE_LOB_SEG LOBSEGMENT LOB_DATA
IMAGE_LOB_IDX LOBINDEX LOB_DATA
댓글 없음:
댓글 쓰기