본문 바로가기
oracle/[Admin] 이론

[이론] chapter 08. Oracle 저장구조(정리x)

by #moonyz 2014. 10. 23.

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 관리

-



댓글