Database/Oracle

[Oracle] LOB(Large Object)에 대해서

이상한금요일 2025. 2. 17. 16:30
728x90

어떤 테이블에 LOB 타입의 컬럼이 생성되면,
기본적으로 LOB index와 LOB segment가 생성되고
테이블의 LOB 컬럼에는 LOB index 주소값(포인터)가 저장됩니다.

LOB segment는 Chunk 단위(LOB 저장 단위, Default: db_block_size)로 저장됩니다.

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

 

TABLESPACE

  • 테이블의 tablespace와 LOB의 tablespace는 서로 다르게 지정할 수 있음.
    • 일반 Tablespace 와 다른 Uniform extent 저장
    • 백업/복구 및 효율적 공간 관리
  • LOB Segment, LOB Index 는 분리 저장 불가

동작 방식

  • 테이블의 LOB 은 실제로 LOB Index 만 지정
  • LOB Index 는 LOB 조각 모두 지정
  • Table LOB Locator 에서 포인터 참조 후 인덱스 경유하여 Random Access

읽기 일관성 구현

  • 일관성 이미지를 LOB Segment 자체에 저장
  • Transaction이 LOB을 변경(Update)하면 과거 데이터를 남겨두고 새 데이터 저장 위해 Chunk 할당
  • 롤백 시 LOB Index Pointer 만 과거 이미지로 변경
  • Undo Tablespace의 이미지는 Lob Locator와 Lob Index를 위해서만 사용

CHUNK

... lob (COL_NAME) store as basicfile "SEG_NAME" (chunk 8192);

  • Bytes 단위 명시 가능하나, DB Block Size 의 배수 중 Chunk 지정 사이즈 이상의 최소값으로 지정
    • Block size 8192 이고 Chunk 를 20000 으로 지정 했을 시 실제 Chunk 사이즈는 24576
    • Min 은 db_block_size / Max 는 32767
  • 각 LOB 의 값은 실제 사이즈와 무관하게 최소 하나의 Chunk 사용 함
  • Chunk Size 가 작을 때
    • LOB Segment 할당 단위 세분화로 공간 효율적 사용 가능
    • LOB Index 가 복잡해짐
  • Chunk Size 가 Block Size 보다 클 때
    • Multiblock Read I/O 가능
  • Default: db_block_size

LOB 컬럼을 가진 테이블이 partition 되어 저장된다면,
해당 LOB index/segment 모두 partition 되어 저장됩니다.


LOB 종류

저장 위치별 분류

  • Internal - CLOB/NCLOB/BLOB/SECUREFILE
  • External - BFILES

유형별 분류

  • CLOB ( Internal )
    • XML이나 일반 문장과 같은 문자 정보를 대량 저장
    • DB 캐릭터셋 변환 적용 - 검색 시 DB 캐릭터셋 <-> Client 캐릭터셋 변환
  • NCLOB ( Internal )
    • CLOB 과 유사하나 DB 의 National 캐릭터셋으로 저장
  • BLOB ( Internal )
    • 이미지, 워드 문서 등의 정보를 대량 저장
    • 캐릭터셋 변환 적용되지 않음
  • Securefiles ( Internal )
    • 기존 LOB 을 대체하기 위한 11G 이상 버전에서 지원되는 객체
    • 중복제거/압축/암호화/저널링 등 지원
  • BFILES ( External )
    • 운영체제 파일에 대한 포인터
    • 파일의 내용에 대해 읽기 모드로만 접근 가능
    • 데이터 저장 위해 Oracle Directory Object 사용
    • 읽기 일관성 보장 되지 않음
    • 세션별 Open 할 수 있는 파일은 session_max_open_files 에 따름(Default 10)

참고 사이트

http://www.gurubee.net/wiki/pages/27428279

https://velog.io/@emawlrdl/%EC%98%A4%EB%9D%BC%ED%81%B4-LOB%ED%83%80%EC%9E%85-indexsegment

728x90