Lob 타입 데이터는 구조화되지 않은 용량이 큰 데이터를 저장할 수 있는 데이터 타입입니다.
Oracle 8i버전 부터 LOB 데이터타입이 소개되었고, 그 이전버전에서는 LONG타입으로 사용하고 있었습니다.
LOB(Large Object)
LOB타입은 4가지 타입의 유형으로 나눌 수 있습니다.
CLOB : 문자 대형객체(Character),Oracle은 CLOB과 VARCHAR2사이에 암시적 변환을 수행함.
BLOB : 이진 대형객체(Binary), 이미지, 동영상, MP3 등
NCLOB :내셔널 문자 대형객체(National, Oracle에서 정의되는 National Character set을 따르는 문자
BFILE : OS에 저장되는 이진 파일의 이름과 위치를 저장. 읽기 전용모드로만 액세스 가능
데이터베이스 내부,외부에 따라서도 나눌 수 있습니다.
내부로는 Table LOB형식의 컬럼을 생성하고 이곳에 데이터의 실제위치를 가리키는 위치자(Indicator)를 저장할수도 있고,
외부로는 OS상에 바이너리 파일로 저장하여 읽기 전용으로 그것을 읽는 BFILE형식이 있습니다.
아래는 다양한 유형의 데이터입니다. 이중 LOB에 적합한 데이터인지 보도록 하겠습니다.
Simple Structured Data: 구조가 비즈니스 규칙을 기반으로 하는 단순 테이블로 구성될 수 있음
Complex Structured Data: 일반적으로 관계형 데이터베이스에서 사용할 수 있는 데이터 구조임
Semi Structured Dtata : XML 파일과 같이 데이터베이스에서 해석되지 않는 논리적구조를 갖음
Unstructured Data: : 바이너리 파일로 저장된 사진과 같이 데이터베이스나 애플리케이션에서 해석되지 않으며 더 작은 논리 구조로 분류되지 않음
LOB타입과 LONG타입의 차이점
용량 : 4GB이상의 데이터를 저장할 수 있습니다.LONG 타입은 최대 2GB까지 저장가능
테이블의 LOB 컬럼 수 : 테이블은 여러 LOB컬럼을 포함할 수 있습니다. 테이블의 LOB 컬럼은 모든 LOB 유형을 포함할 수 있는 반면, LONG타입의 경우에는 단일 LONG컬럼만 가질 수 있습니다.
데이터 액세스 : LOB데이터는 액세스시 랜덤액세스를 지원합니다. LONG 타입은 sequential 액세스만 지원합니다.
LONG | LOB |
최대 2GB까지 저장가능 | 4GB이상 저장 가능 |
테이블당 하나의 컬럼만 생성가능 | 테이블당 여러 컬럼 생성가능 |
Sequential 액세스 | Random 액세스 |
바이너리 데이터만 저장가능 | 바이너리 및 문자데이터 모두 저장가능 |
출처 : www.geeksforgeeks.org/difference-between-longs-vs-lobs/,stepping.tistory.com/30
DBA_LOBS
현재 DB가 가지고 있는 LOB데이터 타입 컬럼에 대한 정보를 보여주는 딕셔너리 뷰입니다.
LOB데이터 타입을 일반적으로 테이블이 저장되는 테이블스페이스와 다른 테이블스페이스에 저장하여 관리하기 때문에 해당 딕셔너리 뷰를 통해 어떤 테이블스페이스에 저장되어 있는지 확인할 수 있습니다.
생성 예
CREATE TABLE <table name>
(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>...]) ... ]
1)Tablespace와 Storage parameter
LOB,LOB Index에 대한 Tablespace를 지정하지 않는 경우, 해당 Table이 저장되는 Tablespace에 같이 저장됩니다.
관리상 LOB컬럼에 대해 다른 Tablespace를 지정하는것이 Contention을 줄일 수 있어 효과적입니다.
LOB Index는 LOB 컬럼의 내부적 저장 위치를 연결시켜주는 Indicator를 저장한 Index입니다.
LOB Index에 대한 파라미터 변경은 alter index문이 아니라, alter table문을 이용하여야합니다.단, Index명을 바꿀 수는 없습니다.
2.PCTVERSION
일반적인 테이블의 데이터 변경시에는 Undo에 이전 데이터를 저장합니다. 하지만 LOB데이터의 경우 크기가 크기 때문에 UNDO에 저장하지 않고, old version 데이터를 유지하는 방법으로 Read consistency를 제공하고 있습니다.
pctversion은 old version lobdata가 차지하는 percentage입니다.
예를들어 pctversion 값이 10이면 새로운 Lob data가 old version의 10%가 저장될때 까지는 Old version을 가지고 있다가 이 이상 크기가되면 해당 공간을 overwrite해서 재사용하게 됩니다.
이 설정값이 크다면 ORA-01555: snapshot too old 에러를 피할 수도 있습니다. DB의 성격에 따라 판단 후 설정하면 될 것 같습니다.
만약 Lob데이터가 read-only인 경우에는 pctversion을 0으로 설정할 수 있습니다.
-pctversion 변경 쿼리
SQL> ALTER Table lobtest modify LOB(b) (pctversion 10);
3.CACHE/NOCACHE
자주 access되는 경우라면 cache를 선택하여 사용합니다. default는 nocache입니다.
in-line lob은 영향을 받지 않습니다. in-line lob은 다른 데이터와 마찬가지로 buffer cache에서 바로 읽혀지기 떄문입니다.
CACHE_SIZE_THRESHOLD limit이 적용되지 않기 때문에 cache할떄는 주의해야 합니다.
-cache/nocache 변경 쿼리
SQL> ALTER Table lobtest modify LOB(b) (CACHE/NOCACHE);
4.CHUNK
Lob data를 access하는 단위로서 db_block_size의 배수로 설정합니다. lob 데이터가 저장될 inital extent,next extent는 chunk의 배수로 설정하는 것이 좋습니다.
예를들어 chunk는 32k로 설정하고, disable storage in row를 설정했다면 1K의 데이터를 저장할 때도, 32K가 lob segment에 할당됩니다.
chunk는 in-link lob에는 영향을 주지 않고, out-line lob에만 영향을 줍니다.
lob table이 생성된 이후에는 변경할 수 없습니다.
5.LOGGING/NOLOGGING
Redo정보를 생성할 것이지 여부를 결정하는 설정값입니다. cache를 사용하는 경우에는 무조건 logging을 의미합니다.
logging,nologing에 상관없이 undo정보는 lob index에 대해서만 생성되고 lob데이터에 대해서는 생성하지 않습니다.
-LOGGING/NOLOGGING 변경 쿼리
SQL> ALTER Table lobtest modify LOB(b) (LOGGING/NOLOGGING);
6.ENABLE/DISABLE STORAGE IN ROW
4k이하의 data를 in-line에 저장할 지여부를 결정합니다. default는 enable입니다.
enable인 경우 4k이하의 lob은 in-line,즉 테이블에 저장하고 4k보다 큰 경우에는 out-line lob segment에 저장됩니다. 이때 4k는 control 정보를 포함한 크기로써 실제 in-line으로 저장할 수 있는 최대 크기는 3964bytes입니다.
disable인 경우 모든 data는 out-line에 저장됩니다. 20bytes lob locator만 in-line으로 저장되어 lob index에서 해당 lob block을 찾을 수 있도록 해줍니다.
in-line lob인 경우에는 다른 데이터 타입처럼 REDO.UNDO 정보가 기록됩니다. 하지만 out-line인 경우에는 column locator와 LOB INDEX가 변경되는 경우에만 UNDO정보를 기록합니다. Log segment에 대해서는 UNDo 정보를 만들지 않습니다.
Lob 컬럼에 대한 access가 많지 않은 경우에는 disable을 설정하는것이 바람직합니다. HWM이 작게 유지될 수 있기때문에 Full Table Scan을 자주하는 Table인 경우 유용합니다.
Lob Table이 생성된 이후에는 변경할 수 없습니다.
출처 : haisins.epac.to/wordpress/?p=3551,haisins.epac.to/wordpress/?p=2486
'Oracle > 운영' 카테고리의 다른 글
테이블 단편화(Fragmentation) (0) | 2020.10.08 |
---|---|
Online Move Datafile (12.1 버전 부터 ~) (0) | 2020.10.06 |
Delete와 Truncate (0) | 2020.09.24 |
Oracle Lock 걸린 세션 확인 및 Lock관련 테이블 (0) | 2020.09.21 |
BINARY_FLOAT,BINARY_DOUBLE (0) | 2020.09.11 |
댓글