1. 개요

1) 이벤트 원인

  • LOB 컬럼 생성 시 NOCACHE 옵션을 사용하면, LOB 세그먼트를 읽고 쓰는 작업은 'direct path I/O'를 대기하며 이 때 'direct path read(lob), direct path write(lob)' 이벤트 대기함.
  • CACHE 옵션을 사용하면 버퍼 캐시를 경유하게 되므로 일반 데이터와 동일한 메커니즘 작용함.

2) LOB CACHE 옵션

  • SGA 크기에 여유가 없거나 LOB 데이터의 크기가 크다면 NOCACHE를 사용하는 것이 유리함.
  • LOB 데이터가 크지 않고, 자주 액세스되는 범위가 정해져 있다면 CACHE 옵션을 사용함으로써, 성능 개선 가능

2. LOB 생성 시 주의사항

1) In-line LOB vs Out-of-line LOB

In-line LOB☞ 'enable storage in row' 옵션을 사용하는 경우
☞ 4000 bytes 보다 작은 LOB 데이터는 로우와 같은 블록에 저장됨
☞ 이로 인해, 'Row chaining'을 유발할 가능성이 높음
Out-of-line LOB☞ 'disable storage in row' 옵션을 사용하는 경우
☞ 이로 인해, 'Row chaining'을 유발할 가능성이 낮음

2) LOB 세그먼트 언두

  • 'Out-of-line LOB'의 경우 LOB 데이터는 별도의 LOB 세그먼트에 저장되며, Row 내에는 20 bytes의 LOB Locator 정보만 저장됨.
  • 이 경우 언두 데이터는 LOB Locator에 대해서만 생성되는데, LOB 데이터의 언두 정보는 언두 테이블 스페이스가 아니라 같은 LOB 세그먼트에 저장됨.
  • LOB 세그먼트 언두는 PCTVERSION 옵션에 의해 정해지며, 만약 값이 50이면 LOB 세그먼트 공간 중 50%가 언두 정보를 위해 사용됨.
  • 값이 작을 경우, 'ORA-01555 : snapshot too old'를 유발할 수 있고, 클 경우 공간 낭비가 심해짐.
  • 이를 해결하기 위해서는, PCTVERSION 값을 적절히 유지하고 불필요한 커밋 횟수를 줄여야 함.

3) CACHE / NOCACHE, LOGGING / NOLOGGING

CACHE☞ LOB 데이터의 크기가 작고 자주 액세스 될 경우, 사용
NOCACHE☞ LOB 데이터의 크기가 크고 자주 액세스되지 않거나, 무작위적으로 액세스 될 경우 사용
LOGGING☞ 복구해야 할 데이터라면 LOGGING으로 생성. CACHE 옵션일 경우 LOGGING 옵션 자동 사용
NOLOGGING☞ 복구될 필요가 없는 데이터라면 LOB 생성 시 이 옵션을 사용하여 성능 개선 향상 가능

4) 청크(CHUNK)의 크기

  • 'Out-of-line LOB'인 경우 청크 단위로 LOB 데이터를 저장하게 되며, 큰 청크 사이즈의 문제는 공간이 낭비될 가능성을 높혀줌.
  • 만약 청크가 8K일 경우, 1K 크기의 LOB가 데이터가 INSERT된다면 나머지 7K 공간은 사용 불가함.
  • 기본적으로 청크 크기 단위는 블록 사이즈의 배수가 됨.
  • 만약, 블록 사이즈가 8K인 경우 청크 크기를 5K로 줄 경우, 오라클은 8K보다 작기 때문에 5K를 8K로 변환시킴.

문서에 대하여