글
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)
'Oracle > Admin' 카테고리의 다른 글
[Oracle Admin] Chap 10. Oracle 사용자 관리 (0) | 2013.09.17 |
---|---|
[Oracle Admin] Chap 9. Oracle 메모리 관리 기법들 (0) | 2013.09.17 |
[Oracle Admin] Chap 7. Tablespace 와 Data file 관리하기 (0) | 2013.09.11 |
[Oracle Admin] Chap 6. Redo Log 관리하기 (0) | 2013.09.10 |
[Oracle Admin] Chap 5. Control File 관리하기 (0) | 2013.09.09 |