1. 개념

 LOB은 일반 primitive type, varchar 등과 달리 4000 bytes 이상이 되도 문제없이 저장한다. 또한, 오라클 내부적으로 4000 bytes를 넘지 않으면 inline LOB이라고 해서 redo log에도 남고, lob locator 할당 없이 row가 저장된 데이터 블록 또는 다른 데이터 블록을 직접 가리켜서 저장한다.

 

2. LOB 내부 설계 구조

 out of line LOB(differed LOB)의 경우 lob locator를 가지게되서 같은 column에서 공유하는 LOB index(B* tree)를 타게된다. lob locator는 inode, lob id 등으로 구성되는데, lob id를 키로 LOB index의 특정 leaf node에 접근할 수 있다. 이 leaf node는 한 데이터 블록이고, 데이터가 저장된 데이터 블록을 가리키는 포인터들을 저장하고 있다. 물론 데이터를 저장하는 곳은 할당받은 LOB segment 안이다.

 

 또한, LOB index는 old key도 저장해서 이전 커밋 버전의 데이터 블록을 가리킬 수 있다. 그러므로 flashback query로 LOB을 조회해도 CR(consistent read)가 가능하다. 예상할 수 있듯이, new key는 현재 LOB을 볼 수 있는 leaf node를 말하고, DBMS_LOB 패키지로 여러 블록을 쓰는 LOB 데이터의 중간 블록만 수정하면 수정되는 데이터 블록만 바꿔서 효율적으로 큰 데이터를 CR로 보여줄 수 있다.

 

3. 사족

 이러한 특별한 구조로 인해 rollback을 하면 일반 데이터는 undo segment에서 찾아온 UNDO를 적용하고 redo log에 이를 남기지만, LOB은 leaf node의 데이터 블록을 가리키는 포인터를 수정한다거나, leaf node 블록 자체를 되돌리는 작업을 하고 이를 redo log에 남긴다.

 이 설명은 DBMS에 따라 다를 수 있으며, LOB 데이터를 file system에 맡겨서 파일에 저장한다면 LOB index의 leaf node가 데이터 블록이 아닌 파일을 가리킬 수도 있다.

https://www.slideshare.net/tanelp/oracle-lob-internals-and-performance-tuning

'Oracle DB' 카테고리의 다른 글

알면 좋은 RDBMS 구조 키워드  (0) 2021.07.19
DB에 redo log가 필요한 이유  (0) 2020.04.06
SGA - DB buffer cache  (0) 2019.09.03
SGA - large pool, java pool, fixed SGA  (0) 2019.09.03
SGA - shared pool  (0) 2019.08.31
Posted by sjo200
,