Chap 8. Oracle 저장구조


* data 의 작업 단위

Block < Extent < Segment < Table space < Data base 


  1. Oracle Block   

- Data 의 가장 최소 작업 단위이다. 

- OS Block 을 한 개 이상 합쳐서 생성되며, DB_BLOCK_SIZE 로 지정된다.

- DB_BLOCK_SIZE 파라미터는 Create Database 할 때 한 번 지정이 되면 그 값은 DB를 재 생성 하기 전에는 변경 할 수 없으며 이 값을 Standard Block Size 라고 한다. 

- Block 의 크기는 최소 2KB, 4KB, 8KB, 16KB, 32KB 가 제공된다. (짝수로 하는 것을 권장) 이 중, DB_BLOCK_SIZE 값에 설정 된 크기를 Standard Block Size 라고 하며, 다른 크기들은 Non-Standard Block size 라고 한다. 

- 이런 Block size 들은 tablespace 를 생성할 때 이용할 수 있지만, Standard Block Size 외의 크기를 가지고 tablespace 를 생성하려면 DB Buffer cache 에도 해당 block size 만큼의 공간이 할당 되어 있어야 한다. 즉, 아래 내용을 보면, 

## 우선 아래처럼 설정되어 있는 db_block_size 을 확인, (8K 이다.)

SYS> show parameter db_block_size;


NAME     TYPE VALUE

------------------------------------ ----------- ------------------------------

 

db_block_size     integer 8192


## 아래처럼 4K 크기로 tablespace 를 만들면 standard block size 가 아니므로  에러가 난다. 

SYS> create tablespace test_4k datafile '/app/oracle/oradata/testdb/test01.dbf' size 5M blocksize 4k;

create tablespace test_4k datafile '/app/oracle/oradata/testdb/test01.dbf' size 5M blocksize 4k

*

ERROR at line 1:

ORA-29339: tablespace block size 4096 does not match configured block sizes


## 이럴 경우, DB Cache 에 미리 공간을 할당하고,

SYS> alter system set db_4k_cache_size=10M;


 

System altered.


## 다시 생성, 

SYS> create tablespace test_4k datafile '/app/oracle/oradata/testdb/test01.dbf' size 5M blocksize 4K;


 

Tablespace created.


  2. Oracle Data Block 의 상세구조   

- 아래는 Data Block 의 상세 구조이다. 

 

 

 

 

Data Block Layout


 

Cache layer (common)

     Block header

 Transaction layer : fixed

 Transaction layer : variable

 

 

 Table directory

     Data layer

 Row directory

 Free space

 Row data

 

 

 

 

- 각 크기 조회하는 방법

 SYS> select component, type, description, type_size from v$type_size where component in ('KCB', 'KTB');


COMPONEN TYPE  DESCRIPTION    TYPE_SIZE

-------- -------- -------------------------------- ----------

KCB KCBH  BLOCK COMMON HEADER   20

KTB KTBIT  TRANSACTION VARIABLE HEADER   24

KTB KTBBH  TRANSACTION FIXED HEADER   48

KTB KTBBH_BS TRANSACTION BLOCK BITMAP SEGMENT    8


- 위의 정보를 보면, Block header 의 cache layer 는 20 bytes 이고 (KCBH 로 조회),  아래와 같은 정보가 들어있다.

## Cache layer 에 포함되어 있는 정보

* Data Block Address (DBA)

* Block Type (ex, Table, Index, Undo..)

* Block Format

* System Chane Number (SCN)


- 위의 정보에서, Transaction fixed 는 48 bytes 로 지정이 되어 있고, 이 곳에는 Block type, 마지막으로 수행된 Block Cleanout 시간, ITL Entries 정보, Free List Link 정보, Free space Lock 정보 등이 저장되어 있다. 


- 그리고 Transaction Variable 영역은 KTBIT 부분에 해당하며 24 bytes 의 크기를 가지고 있다. 이 부분에는 해당 Block 에 있는 row 를 변경하기를 원하는 실제 ITL 관련 정보가 들어간다. 사용자가 많으면 이 부분의 내용이 많아지고 사용자가 적으면 내용이 적어진다.


- Data layer: 실제 데이터가 저장되는 곳이므로 Free space 관리가 중요하다. 그래서 늘 비어있는 free space 정보를 관리하고 있는데 row index 에서 첫 번째 빈 공간의 포인터 주소와 빈 공간의 시작과 끝나느 offset 주소, 사용가능한 빈 공간의 양을 가지고 있다. 


 3. PCTFREE 와 PCTUSED   

1) PCTFREE

- 해당 Block 에 입력되어 있는 데이터들이 update 될 경우를 대비해서 예약을 해두는 공간이다. 

- 원본 데이터보다 더 큰 크기의 데이터가 update 될 경우, 해당 block 에 여유 공간이 없어서 다른 block 으로 migration (row migration) 을 해야할 경우 성능 저하가 올 수 있다. 

- 이 값은 해당 block 크기의 %로 지정한다. 즉, 해당 Block 이 8KB 라고 하고, PCTFREE=20 이라고 지정했다면, 8KB의 20%만큼 update 만을 위한 공간으로 예약이 되어 해당 공간에는 insert 는 안되고 update만 된다. 그리고 이 공간만큼을 뺀 나머지 공간이 다 찼을 경우는 해당 block 의 더 이상 빈 공간이 없다고 판단(dirty block) 하게 된다.  


2) PCTUSED

- Block 의 재사용 여부를 결정하는 요소로, 현재 데이터의 사용량이 이 설정값 이하로 남아 있을 경우에 해당 Block 의 상태를 dirty 에서 free 로 반환할 수 있다. 

- 즉, 해당 Block 에 PCTUSED 가 40% 로 설정이 되어 있다면, 해당 block 에 데이터 적재량이 그 block 의 40% 이하가 되어야 이 block 으로 데이터가 다시 insert 될 수 있다. 


  4. Row Chaining & Row Migration   

- 데이터가  Block 에 저장이 될 때는 보통  row 단위로 입력이 되는데 row overhead 와 column data 부분으로 나눌 수 있다. row overhead 에는 lock 정보 같은 것이 들어가 있고, column data 부분이 실제 데이터가 들어가는 부분이다.

- Row Chaining 

만약 입력 되는 데이터가 너무 길어서 하나의 block column data 부분에 들어가지를 못한다면 해당 row 를 다른 block 에 연결해서 저장하게 된다. 즉, A 라는 Block 에 사용가능한 공간이 1KB 정도 밖에 없는데 데이터가 2KB 가 들어온다면 A block 에 1KB 를 저장하고 나머지 1KB 는 다른 block 에 이어서 저장한다. 이런 경우를 Row Chainin 라고 한다. 


- Row Migration

특정 Block 에 위치하던 row 가 더 큰 크기로 update 가 될 때 해당 block 의 크기가 너무 작아서 다른 block 으로 이사를 가는 것을 말한다. 이럴 경우 이전 block 으로 찾아오는 액서스들을 위해 원래 block 의 이사가는 신규 block 의 주소를 남겨 두게 되는데 이런 이유로 I/O 가 더 많이 일어나게 된다. 즉, 성능에 좋지 않다.


  5. Extent 와 Segment   

1) Extent

- Block 을 여러 개 묶어 놓은 단위

- 테이블을 생성하면 Block 을 묶어서 Extent 를 생성하게 되고, 데이터가 계속 추가되어서 최초의 Extent 를 다 사용하게 되면, 자동으로 Extent 를 추가 생성하게 된다. 

- Extend 의 기본 단위는 64K 이고 Extend 에 데이터를 어디까지 사용했는지를 표시하기 위한 책갈피 역활을 하는 하는 애가 High Water Mark 라고 한다. 

- Extent 를 미리 확보하기 위해 수동으로 할당 할 수도 있는데, 이럴 경우 (미리 확보해 둘 경우) :

* 단점 : 데이터가 할당해 둔 것보다 훨씬 작게 들어온다면 비어 있는 공간이 많이 생겨 공간 낭비가 심할 수 있다.

* 장점 : 하나의 데이터파일에 여러 테이블이 저장 될 수 있는데, 미리 Extent 를 확보해 두면 각 테이블에 데이터의 분산을 막을 수 있다.


2) Segment 

- 쉽게 말해 데이터를 담는 통이다. Data segment 는 우리가 알고 있는 table 이고, Index segment 는 index 이다. 

- Undo, Temp, LOB 등이 대표적인 segment 의 종류 들이다. 


  6. Extent 관리 기법  

1) Dictionary Management Tablespace (DMT)

- Oracle 8 버전까지 사용했던 방식으로 모든 데이터 파일을 Dictionary 에서 Free/used block 을 중앙 집중적으로 관리했던 방식이다. 

- Free Block 은 FET$ (Free Extent Table) 에서, Dirty Block 은 UET$ (Used Extent Table) 에서 관리했다. 

- 만약 Drop Tablespace 같은 이유로 Dirty extent -> Free extent 가 된다면, 위의 테이블들을 업데이트 해야만 했다. 

- 단점 : 데이터가 한꺼번에 몰려서 Free Extent 를 요청하거나, Drop 명령등의 수행으로 FET$ 를 업데이트 해야 할 경우 심각한 병목현상이 발생해 성능 저하가 올 수 있다. 


2) Locally Managed Tablespace (LMT) 

- Oracle 8 버전의 단점으로 인해 9i 부터는 DMT 대신 LMT 방식을 도입하게 되었는데, 아래의 2가지 방식으로 관리가 된다. 

Free List Management (FLM) 

- 9i 버전에서 쓰는 Extent 관리기법

- Free Extents 를 관리하기 위해서는 Free List 와 Free Group 이라는 것을 사용한다. 

- Free List 는 Segment 단위로 작성이 되는데, 즉, Table 단위로 생성이 된다. 아래와 같이 3가지 종류가 있다. 

* Master Free List (Segment Free List)

해당 Segment 에 새롭게 할당된 Free Block 이나 트랜잭션이 종료되어 Dirty -> Free 로 반환된 Block 들의 목록이 저장되어 있다. 테이블 생성시 Storage 설정으로 Process Free List 를 지정하지 않으면 기본적으로 이 Free List 만 만들어 지고 전체 Block 를 관리하게 된다. 

* Process Free List

트랜잭션이 종료되어 Dirty -> Free 로 반환된 Block 들의 목록이 저장되어 있다. Master Free List 의 경합을 막기 위해서 사용된다. 

* Transaction Free List

현재 세션이 Transaction 을 수행하는 도중 Free Block 으로 변한 Block 들의 목록을 관리한다. 예를 들어, 특정 row 가 update 되거나 delete 되어서 해당 row 가 들어 있던 block 이 PCTUSED 파라미터 값에 도달하게 되서 Free Block 으로 변하게 되면 이 block 을 바로  Master Free List 로 반환하지 않고 Transaction 이 수행되고 있는 기간동안 이 List 에 등록해 두고 Free Block 이 필요할 경우 우선적으로 사용하게 된다. 

- FLM 의 단점은 현재 사용량을 알수가 없다. 

Automatic Segment Space Management (ASSM)

- 10g 버전부터의 Extent 관리기법이다. 

- FLM 이  Free List 의 관리에 따라 성능이 결정이 되는 수동 모드의 관리 방법이라면, ASSM 은 Oracle 이 자동으로 Extent 를 관리하는 기법이다. 

- 기존에 사용하던 Free List 대신에 아래처럼 Bitmap 으로 사용 정도를 관리하게 된다.

* 0000 : 포멧이 안된 상태

* 0001 : 100% 사용중인 상태

* 0010 : 0~25% Free space 가 있는 상태 (FS1)

* 0011 : 25~50% Free space 가 있는 상태 (FS2)

* 0100 : 50~75% Free space 가 있는 상태 (FS3)

* 0101 : 75~100% Free space 가 있는 상태 (FS4) 

by 짱구를꼭말려 2013. 9. 14. 00:14