본문 바로가기

오라클/이론 및 실습

Oracle 저장 구조 - Extent와 Segment

2. Extent

Extent는 연속적으로 있는 Block을 묶어 둔 것을 의미하는 논리적 단위이다.


테이블에 데이터가 없을 시라도 자동으로 할당이 되며, 최초 값을 다 사용 시 추가로 생성한다.


Extent의 크기는 Segment 생성 시 STORAGE라는 파라미터를 이용해서 수동으로 지정할 수 있고 생략시에는 Tablespace의 기본 설정값을 적용받게 되며 최소값은 64KB이다.


하나의 데이터파일에 여러 개의 테이블이 저장될 수 있는데 테이블별로 Block의 구역을 나누어 저장해 검색 범위를 줄이기 위해 Extent를 사용한다.


새로운 Extent를 할당 받을 때 기본적으로 64KB(8개 블록)을 할당받는데 이 때 당장 사용할 일부(2개라 가정)만 포맷하고 데이터를 기록한다. 그리고 현재 2개만 사용하고 있다는 의미로 High Water Mark를 설정한다.


3. Segment

Segment는 Extent를 여러 개 묶어 둔 것을 의미하는 논리적 단위이다.


Oracle Object 중 독자적인 저장 공간을 가지는 것들을 말한다. 쉽게 말하자면 데이터가 증가되면 용량이 증가되는 것들이란 뜻이다. Table, Index, Undo, Temp 등이 있다.


Segment를 구성하는 여러 개의 Extent중 가장 첫번째 Extent의 첫번째 Block에 Segment의 전체 요약 정보인 Segment Header가 들어가게 된다. Segment Header에는 해당 Segment의 종류에 대한 정보가 들어가며 Extent의 할당 상태와 공간 사용 내역 등이 들어가게 된다.


4. DMT(Dictionary Management Tablespace)와 LMT(Locally Managed Tablespace)

우선 Extent들의 정보 중에서 Free Block은 FET$(Free Extent Table)에서 관리하고 사용자는 DBA_FREE_SPACE에서 조회할 수 있다. 

Dirty Block은 UET$(Used Extent Table)에서 관리하며 DBA_EXTENTS에서 볼 수 있다.


사용자가 작업을 통해서 Dirty Extent에서 Free Extent가 된다면 위 FET$와 UET$를 업데이트해야만 한다. 이렇게 Block의 정보들을 딕셔너리를 사용해 일괄적으로 관리하는 방식의 Tablespace를 DMT라 한다.


DMT는 새로운 Free Extent가 필요하면 FET$에서 검색을 하게 된다.

이 때 서버프로세스는 원하는 것보다 큰 사이즈의 Extent를 만나면 표시를 해두고 계속 검색을 한다. 

만일 원하는 사이즈의 Extent가 없다면 찾아둔 큰 사이즈의 Extent를 쪼개서 사용한다.

만일 큰 사이즈의 Extent조차 없다면 작은 사이즈의 Extent를 합쳐서 사용한다.

어떻게 해도 찾을 수 없다면 신규 Extent를 생성하게 된다.


이렇게 찾아낸 Extent를 FET$, UET$ 테이블등에 기록하고 Segment Header에도 기록해야한다.


여러 서버 프로세스가 동시에 FET$에서 검색할 수 없도록 딕셔너리에 ST락을 걸어준다.


데이터가 몰려서 FET$를 업데이트 해야할 경우 병목 현상이 발생하며, 여러 사용자가 Free Extent를 찾을 경우 동시에 진행할 수 없어 성능에 문제가 생긴다.


이러한 문제점을 해결하기 위해 나온 방식이 LMT 방식이다. 성능과 안정성이 좋아 9i부터는 기본 생성값이 되었다.


LMT는 해당 Tablespace의 데이터파일 Header에 존재하는 비트맵에 Extent의 사용 유무를 기록하는 방식이다. 즉 딕셔너리가 아닌 블록에서 서 자체적으로 해결하기 때문에 부하가 줄어들게 된다.


5. Free List Management(FLM)을 사용한 Extent 관리

FLM방식으로 Free Extents를 관리하기 위해서는 Free lists와 Free list group을 사용하게 된다.


Free list는 LIFO방식으로 운영되며 Linked List로 이루어져 있으며 다음과 같이 3가지 종류가 있다.

1) Master Free List(Segment Free List)

 - 해당 Segment에 새롭게 할당된 Free Block이나 트랜잭션이 완료되어 Dirty에서 Free로 반환된 Block들의 목록이 저장되어 있다. 별도의 설정이 없다면 기본적으로 이 Free List가 전체 블록들을 관리한다.


2) Process Free List

 - Master Free List와 마찬가지로 해당 Segment에 트랜잭션이 끝나서 Free Block이 된 명단을 가지고 있다.

 - Master Free List의 경합을 막기 위해 사용된다.

 - 여러 서버 프로세스들이 1개뿐인 Master Free List를 이용하려면 경합이 발생해 Buffer Busy Waits 현상이 발생되기 때문에 각 프로세스 별로 Free List를 분리해서 할당해주는 것이다.

 - 이 값의 기본값은 1이기에 별도의 설정이 없다면 최악의 성능을 내게 된다.


3) Transaction Free List

 - 현재 세션이 Transaction을 수행하는 도중 Free Block으로 변한 블록들의 목록을 관리한다.

 - 트랜잭션을 진행 중인 세션에서 특정 블록이 Free Block이 될 경우 Master Free List로 반환하는 대신에 해당 트랜잭션이 수행되고 있는 기간동안 자신의 트랜잭션 수행 시 필요한 경우 우선적으로 사용한다.

 - 트랜잭션이 끝나게 되면(commit 되면) 리스트에 있는 Free block들은 모두 Master Free List로 반납된다.


만일 Process Free list의 Free Extent가 전부 소진되어 Master Free List에 요청을 했는데 Master Free List에도 Free Extent가 없을 경우 HWM을 오른쪽으로 이동시킨 후에 Free Extent를 새로 생성 및 할당한다.


여러 프로세스가 동시에 HWM을 건드리지 못하도록 HW락을 획득해야만 한다.


HWM의 이동은 _BUMP_HIGHWATER_MARK_COUNT라는 파라미터에 개수가 정해져 있다.


FLM 방식으로 운영되는 Segment는 Segment Header, HWM정보와 사용중인 Extent들의 정보가 저장되는 Extent Map, Free block들의 위치값을 가지는 Free List Area 공간, 실제 데이터가 저장되는 Block들로 구성되어 있다.


Segment Header에는 다음과 같은 정보들이 저장되어 있다.

 - Free list의 사용 중 유무

 - Free list 저장이 시작되는 Block 주소와 끝나는 Block 주소

 - Extent table / Control[각주:1]


6. Automatic Segment Space Management(ASSM)을 사용한 Extent 관리

FLM은 사용자의 능력에 따라 성능이 차이가 심하게 나기에 Oracle이 자동으로 관리해주는 방식이 ASSM이다.


기존의 Freelist를 사용하는 대신 Block의 사용 정도를 Bitmap으로 관리하게 된다.


Bitmap 정보는 다음과 같다.

 - 0000 : 포맷이 안 된 상태

 - 0001 : 100% 사용중

 - 0010 : 0~25% Free space (FS1)

 - 0011 : 25~50% (FS2)

 - 0100 : 50~75% (FS3)

 - 0101 : 75~100% (FS4)


이러한 Bitmap이 각 Data Block의 Header에 저장되어 있으며 이 정보를 가지고 BMB(Bit Map Block)이 만들어진다.


구조는 위와 같다.


즉, Free Block을 찾아야 할 경우 가장 먼저 L3 BMB를 읽어서 Free Block을 가진 L2 BMB를 찾고 L1 BMB를 찾는다. 이후 해당 블록에 새로운 내용을 추가하고 Block의 헤더 부분에 있는 Bitmap 정보를 변경한다.


Segment의 Block을 순서대로 사용하지는 않는다.


FLM에서는 HWM을 기준으로 왼쪽은 사용중인 Block, 오른쪽은 Free Block이었으나 ASSM은 Block을 순서대로 쓰지 않기에 중간에 빈 Block이 생기게 된다.


그래서 ASSM에서는 High HWM과 Low HWM이라는 개념이 등장한다.

 - Low HWM : 이하의 블록들은 모두 포맷 상태의 블록으로 현재 사용중인 블록이다.

 - High HWM : 이상의 블록들은 모두 비포맷 상태의 블록으로 아직 사용되지 않은 블록들이다.

 - Low와 High 사이에는 아직 사용되지 않은 비포맷 상태의 블록들이 존재할 수 있으며 이 블록들은 추후에 INSERT작업에 의해 사용될 때 포맷을 한다.


위와 같이 ASSM방식의 Block들의 상태를 확인할 수 있다.




  1. 해당 Segment에 속하는 전체 Extent에 대한 정보 [본문으로]

'오라클 > 이론 및 실습' 카테고리의 다른 글

사용자 관리  (0) 2019.07.04
버전별 메모리 관리 기법  (0) 2019.07.02
Oracle 저장 구조 - block(2)  (0) 2019.07.02
Oracle 저장 구조 - block(1)  (0) 2019.07.01
Data file 관리  (0) 2019.06.30