1. Oracle Block 개요
- Oracle Block : OS Block을 한개 이상 합쳐서 생성
EX) Oracle Block 1개의 크기가 8K >> OS Block 1개의 크기가 2K >> OS Block 4개가 모여서 1개의 Oracle Block을 구성(2K x 4개 = 8K)
- DB_BLOCK_SIZE : 블록 크기 지정 파라미터, create database 할때 한번 지정되면 변경 불가능, Standard Block Size
- 최소 2KB 부터 4KB, 8KB, 16KB, 32KB 크기 제공
- Block 크기는 짝수 권장 (홀수도 가능하긴 함)
- Block의 크기가 크면 ?
장점 : 한번에 담을 데이터양이 많아서 I/O를 줄일수 있음
단점 : 데이터가 적을 경우 공간낭비, 대기현상
- 오라클에서 제공하는 기본크기인 Standard Block Size로 사용하기를 권장 <-> Non-Standard Block Size
- Tablespace를 생성할때 다양한 Block Size로 지정해서 사용가능 -> Standard Block Size와 다를경우 DB Buffer cache에도 공간할당해야함
2. Oracle Data Block 상세구조
(1) Block Header
① Cache Layer
- Common Heaer
- KCBH 로 조회
- Data Block Address (DBA)
- Block Type (예 : Table, Index, Undo, ..)
- Block Format (v6, v7, v8, ..)
- System Change Number (SCN : 복구작업 등에 사용됨)
② Transaction Layer : Fixed
- KTBBH 로 조회
- Block Type
- 마지막으로 수행된 Block Cleanout 시간
- ITL Entries 정보
- Free List Link 정보
- Free space Lock 정보 등
③ Transaction Layer : Variable
- KTBIT 로 조회
- 변경하기를 원하는 실제 ITL 관련정보
* ITL ?
- Interested Transaction
- 특정 Block에 데이터를 변경해야 하는데 현재 다른 사용자가 그 Block을 수정중일때 자신의 정보를 적고 순서를 기다리는 대기자명단
- 가변 (Variable) : 사용자가 많으면 내용이 많아질 것이고, 사용자가 적으면 내용이 적어지기 때문
- 기본값 : 테이블에 대한 1개의 ITL과 인덱스에 대한 2개의 ITL정보
- 테이블이나 인덱스를 생성할때 INITRANS 파라미터의 값을 변경하면 기본값 변경가능
* FLM (Free List Management) : 해당 Block이 Free인지 Dirty인지의 유무만 관리
* ASSM (Automatic Segment Space Management) : 해당 Block의 사용정도를 나타내는 Bitmap 정보 추가
(2) Data Layer
- 실제 데이터가 저장되는 곳
- Free space 관리가 중요
- Row index, Table index, Row data, Free space
* Row Index
- 첫번째 빈공간의 포인터 주소, 빈공간의 시작과 끝나는 offset 주소, 사용가능한 빈공간의 양(남아있는)
- KDBH, 14bytes
* Row data
- insert : 데이터가 우선 가운데로 입력 -> 실제 데이터는 아래로 이동 -> 해당 데이터의 정보는 위로 기록(row index)
- update : 기존 데이터가 차지하고 있던 공간을 재활용 시도 -> 연속적인 공간이 부족할 경우 -> 해당 block압축 시도 (kdbcps()함수 호출)
3. PCTFREE 와 PCTUSED ※PCT : percent (%)
(1) PCTFREE
- 해당 블록에 입력되어있는 데이터들이 update될 경우를 대비해서 예약을 해두는 공간
- 해당 블록 크기의 %로 지정
- %로 지정한 공간만큼 데이터가 다 차게 되면 Dirty Block으로 변경됨.
(2) PCTUSED
- Dirty List에 등록된 Block은 특정량이 지워질때까지는 Free List로 생각하지 않음.
- 지워진후 남은 용량이 얼마가 되어야 Free Block이 되는가를 결정하는 파라미터
PCTFREE 공간을 제외한 모든 공간에 데이터가 차서 Dirty Block으로 상태가 변경이 되었는데, Row가 삭제되어서 사용량이 줄었다.
>> (FLM기법으로 관리하는 Block일때) Block을 바로 재사용하지 않고 (Free Block) 특정양이 지워질때까지 기다렸다가 Free Blcok으로 상태가 변경된다
why ? 적은 단위의 데이터가 삭제되고 삽입됨으로 인해서 Free와 Dirty List 업데이트를 자주하면 부하발생하기 때문
(3) 블록 관리 방식
① ASSM (Automatic Segment Space Management)
- PCTFREE사용
- 해당 블록의 사용정도를 나타내는 bitmap 정보추가
② FLM (Free List Management)
- MSSM (Manual Segment Space Management)
- PCTFREE, PCTUSED 둘다사용
- 해당 블록이 Free인지 Dirty인지의 유무만 관리
4. Row Data / Row Chaining & Row Migration
(1) Row data
- Blcok에 데이터가 입력될때는 Row 단위로 특정한 형식을 가진다
- Row = Row overhead(Row header) + Column Data
- Row overhead 부분에 해당 Row에 동시에 트랜잭션을 일으키는 것을 막기위한 정보들 (Lock 정보, 해당 Row에 들어있는 Column Data 개수 등)
- Column Data 부분은 실제 데이터가 저장되는 곳
(2) Row Chaining
- 데이터가 길어서 하나의 블록에 모두 기록할수 없을 경우 다른 블록에 연결해서 저장
- 주로 블록의 크기보다 큰 데이터가 들어오는 경우에 많이 발생
- Row chaining을 줄이기 위해서 블록의 크기를 늘린다면 wait 현상이 많이 발생하여 성능이 떨어짐.
(3) Row Migration
- 특정 블록에 위치하던 Row가 update등의 이유로 블록공간이 부족해서 다른공간으로 이사하는 현상
- 주로 update 작업시 해당 공간이 부족하여 발생
- Row Migration을 줄이기 위해서 PCTFREE값을 많이주면 update가 없을경우 낭비되는 공간이 많음
- Migration 작업시 원래 블록에 신규 블록정보를 기록하여 이전 블록으로 찾아오는 액세스에게 안내함
5. Extent와 Segment
- Block : 데이터를 저장하는 가장 기본적인 단위
- Extent : 연속적으로 있는 블록을 묶어둔것
- Segment : extent가 여러개 모여서 구성
(1) Extent
- 테이블 생성시 데이터가 없더라도 연속적인 블록을 묶어서 Extent 생성함.
- 9i부터 기본 Extent 크기는 64KB (하나의 Extent = 8KB블록 X 8개)
- 하나의 데이터파일에 여러개의 테이블이 저장될수 있는데 테이블별로 블록의 구역을 나누어 저장하기위해서 Extent 미리 확보
* Extent Size
Size가 같은 Extent만 재활용 하기 때문에 Extent 크기가 다양하면 Data File에 빈공간이 많이 생김
-> 9i 부터 Extent size가 통일
* Extent 크기를 지정하는 방법
- 세그먼트를 생성할때 STORAGE 라는 파라미터를 이용해서 수동으로 지정
- 세그먼트 생성시 파라미터 생략하면 해당 테이블이 저장될 Tablespace의 기본 설정값을 적용 (최소값 64KB = 블록 8K * 8개)
① 테이블 생성시 자동으로 Extent 생성됨
- 사용자가 테이블을 구성하게 되면 데이터가 없더라도 기본값을 가지고 데이터파일에 연속적인 블록을 묶어서 Extent를 생성함.
- 데이터가 계속 추가되어서 최초 값을 다 사용하게 되면 extent를 추가로 생성.
② 특정 테이블에 수동으로 추가 할당
- 8KB블록 8개가 하나의 Extent이므로 64배수만큼의 용량이 할당됨 (9i 부터 extent size 통일)
- Extent를 수동으로 할당해 주는 경우는 해당 테이블이 사용할 Extent를 미리 확보해 두기 위함
- 같은 하나의 데이터 파일에 여러 테이블이 저장될수 있으므로 미리 Extent를 확보하여 테이블이 분산되는 것을 막기 위함
③ 사용 안된 Extent를 반환하는 방법
- Extent를 대량으로 확보했을때 데이터가 들어오지 않는다면 공간 낭비
- 데이터가 들어있다가 삭제되어 비어있는 경우라면 이미 사용이 된 Extent이기 때문에 deallocate로 반납 불가능
6. Free Lisk Management (FLM) 기법을 사용한 Extent 관리
-
7. Automatic Segment Space Management(ASSM) 기법을 사용한 Extent 관리
-
'oracle > [Admin] 이론' 카테고리의 다른 글
[이론] chapter 10. 사용자관리 (정리X) (0) | 2014.10.27 |
---|---|
[이론] chapter 09. (0) | 2014.10.24 |
[정리] Redo Log, Control, Data File 관리하기 (2) | 2014.10.22 |
[이론] chapter 07. Tablespace / Data File 관리 (0) | 2014.10.21 |
[이론] chapter 06. Redo Log 관리 (3) | 2014.10.20 |
댓글