[Storage - 1] Database Block

 


Oracle block 은 논리적인 최소 I/O 단위다. Oracle block는 하나 또는 하나이상의 OS block 으로 구성되어 있다.
(이하 본문에서는 Oracle Block을 간단히 Block으로 하기로 한다..)

Block 은 데이터 파일에서 Server Process 가 읽어서 DB Buffer Cache으로 적재할때 Block 단위로 적재한다. 그리고 OS Block으로 구성되기 때문에 반드시 OS Block 크기보다 같거나 크다.
이 Block 의 크기는 Database를 생성할 때 단 한번 설정 할 수 있는데, 이후에 이 값은 바꿀 수 없다.

 위 그림에 나와있듯이 Block 의 크기는 DB_BLOCK_SIZE 파라미터에 의해 결정되는데 9i의 기본 크기는 4kb이고 10g와 11g는 8kb를 기본크기로 사용한다.
 일반적으로 텍스트 위주의 데이터를 사용하는 DB는 Block의 크기를 작게 사용하고, 동영상 같은 큰 데이터를 사용하는 DB는 Block 크기를 크게 사용한다.


Block 의 구조와 용어


 


HEADER
대표적으로 ITL(Interested Transaction List) 이 위치한다.. ITL은 이 블록을 변경하고자 하는 트랜잭션의 List을 의미하는데 Block의 Header에서 ITL를 관리한다.

ITL은 블록을 변경하는 트랜잭션의 정보를 담고 있는 List 이다. 
처음 INITANS 값에 의해 몇개의 Slot (Entry)을 만들지 정하게 되는데 이 INITANS 값은 테이블 생성시 설정한다.
Slot은  트랜젝션이 발생할 때 Free한 Slot이 없으면 증가하게 된다. 이때 동시에 존재할 수 있는 slot의 개수는  MAXTRNAS으로 설정된 개수 값과 block의 여유 공간 내에서 결정된다. (10g부터는 MAXTRANS이 255로 고정) 만약 block 의 여유공간이 없다면 다른 트랜젝션이 끝나서 Slot 이 해제 될 때까지 기다린다.( ITL WAIT EVENT) 

참고  :  
http://wiki.ex-em.com/index.php/Enq:_TX_-_allocate_ITL_entry   
http://avdeo.com/2008/06/16/interested-transaction-list-itl/


INITRANS
Block Header의 ITL내에 초기에 생성될 slot의 개수. 트랜잭션이 많이 일어나는 테이블이면 크게 설정하고, 트랜젝션이 많이 발생하지 않는다면 작게 설정한다. 대게 같은 block 내에서 동시에 많은 내용이 수정되는 일은 드물다.
기본값은 1이다.

MAXTRANS
동시에 트랜젝션이 수행되기 위해서는 트랜젝션만큼 slot이 존재해야 하는데 Slot의 최대수가 이 파라미터 값에 의해 결정된다. 이 값이 5개로 고정되어 있다면 같은 블록에 대해 동시 트랜젝션이 6개가 발생하면 마지막 1개는 다른 트랜젝션이 끝날때까지 기다리게 된다. (ITL WAIT EVENT)
기본값 255, 10g 부터 255 고정되어 수정 할 수 없다.

PCTFREE
Update를 위해 남겨놓는 공간이다. 
예를 들어 크기 3에 해당하는 데이터가 있는데 4 해당하는 크기의 데이터로 수정을 하려고 한다. 이때 블록의 여유공간을 남겨서 동일한 블록내에서 데이터가 수정되도록 한다. (즉 ROW MIGRATION 이 발생하지 않도록 하기 위해서 사용한다.)
최대값 : 50%

PCTUSED
FLM방식을 사용하면 Free block을 세그먼트 헤더 내에 Free List 통해 관리를 하게 되는데 Free Block 상태가 되기 위해서는 저장된 데이터의 양이 PCTUSED으로 설정된 영역만큼 사용량이 낮아져야 한다.
FLM 방식을 사용 할때만 적용된다.

Free List
FLM(Free List Management) 을 사용하게 되면 Block을 관리를 하기 위해서 Free block을 세그먼트에 저장한다.

이슈

ROW MIGRATION

어떤 값을 update를 하려고 할때 해당 블록에 빈 공간이 없으면 해당 row는 다른 블록으로 옮겨지고 원래 있던 공간에는 옮겨간 곳의 주소를 저장한다. 이것이 바로 row migration 인데 아래 그림을 보고 이해하자.

크기가 2인 BB 데이터를 크기가 3인 BBB로 수정한다. 하지만 1 block에는 여유공간이 없기 때문에 BBB값을 기록할 수 없다. 그래서 2 block에 기록하게 되고 1 block는 BBB 의 주소값인 point 값이 저장된다.
이 현상을 바로 ROW MIGRATION 이라고 한다.


이렇게 ROW MIGRATION이 일어난 block을 조회하는 과정을 그림을 통해 보자.
 block의 BBB를 조회하고자 할 때는 먼저 block1이 DB Buffer Cache에 적재되고 BBB가 기록된 곳을 가르키는 Point값에 의해 2 block도 적재된다. 이렇게 되면 I/O 가 두번 발생하게 되고 성능 저하가 발생한다.




Row chaning
데이터가 너무 커서 한개 block 이상을 사용하는 상태를 말한다. LOB같은 큰 데이터 타입을 사용할 때 이런 현상이 나타난다. 이슈라고 하기보다 당연한 현상이다.



'Oracle > Architecture' 카테고리의 다른 글

[Storage - 3] Segment  (0) 2012.01.27
[Storage - 2] Extent  (0) 2012.01.27
SHUTDOWN > NOMOUNT > MOUNT > OPEN  (0) 2012.01.24
Oracle Server Architecture 용어 정리  (0) 2012.01.17
[10g] Redo Log 관리  (0) 2011.10.26