ch8. oracle저장구조

 

[녹음12]다시듣기.


* Oracle 저장구조




1. Oracle Block

 : oracle block은 os block 한 개 이상 합쳐서 생성하게 된다.

- DB_BLOCK_SIZE 파라미터(=> Standard Block Size) : create database 할 때 한 번 지정이 되면 그 값은 database를 재생성하기 전에는 변경할 수 없다.

- block의 크기 : 2KB, 4KB, 8KB, 16KB, 32KB 

- block크기가 크면 한번에 담을 수 있는 데이터의 양이 많아서 I/O를 줄일 수 있지만, 데이터가 적을 경우 공간이 낭비되고, 대기현상이 많이 생길 수 있다.

- standard block size외의 tablespace를 생성할 경우 database buffer cache에도 해당 block사이즈 만큼의 공간을 미리 할당해 두어야 에러가 발생하지 않는다.


SQL> create tablespace test_4k

   2    datafile '/app/oracle/oradata/testdb/test01.dbf' size 5m

   3    blocksize 4k ;


create tablespace test_4k

*

ERROR at line 1 :

ORA-29339 : tablespace block size 4096 does not match configured block sizes       -- 에러발생


SQL> alter system set db_4k_chache_size=10M ;         -- DB Cache 에 미리 공간 할당


System altered


SQL> create tablespace test_4k

   2    datafile '/app/oracle/oradata/testdb/test01.dbf' size 5m

   3    blocksize 4k ;


Tablespace created      -- 에러없이 생성 




2. Oracle Data Block 상세구조.



3. PCTFREE 와 PCTUSED

- tablespace가 ASSM방식인지 MSSM방식인지에 따라 역할이 달라지고, MSSM방식은 freelist를 사용하므로 FLM이라고도 한다.

- ASSM방식일 경우 PCTFREE파라미터만 사용되지만, FLM일 경우 테이블 생성시 PCTFREE와 PCTUSED파라미터 모두 사용된다.


 1) PCTFREE : 해당 block에 입력되어 있는 데이터들이 update될 경우를 대비해서 예약해두는(비워두는) 공간.

 - 해당 block의 크기의 %로 지정하는데, 만약 pctfree=20으로 지정할 경우, 해당 block의 20%만큼은 update만을 위한 공간으로 예약이 되어서, 이 공간에는 데이터가 insert되지 않고 오직 update되는 경우에만 사용된다. 나머지부분에 데이터가 다 차게되면 이 block은 더이상 빈공간이 없는 dirty block상태로 변경된다.

 - 그 후 이 block에 있는 row가 만약 삭제 되어서 사용량이 줄어들어도 이 block을 즉시 재사용하지 않고, 특정 양이 빌 때까지 기다렸다가 재사용한다.

 (why? : 비어있는 block의 명단은 free list에 다 기록이 되고, 빈공간이 없는 block은 dirty list에 다 기록이 되는데 1건지울때마다 free list와 dirty list를 업데이트 할 경우 그 부하가 더 심하기 때문이다.) (FLM기법의 단점)


 2) PCTUSED : PCTFREE에서 특정양이 지워진 후 남은 용량이 얼마가 되어야 free block이 되는지를 결정하는 파라미터.

- 데이터가 삭제된 후 PCTUSED에 설정된 퍼센트 값만큼 남게되면 이 block을 free block으로 생각해서 데이터를 다시 insert할 수 있다.


  


  



4. Row Data와 Row chaining & Row Migration

 Row chaining

 A block에 1KB가 남았는데 만약 2KB의 정보가 들어올 경우 A Block에 1KB를 저장하고, 나머지1KB는 B Block에 이어서 저장.

 Row chaining 현상이 많이 일어난다면, Block의 크기를 크게 생성하는 것이 좋다.(but, wait현상 많이 발생)

 Row Migration

 특정 Block에 위치하던 Row가 update등의 이유로 해당 block에 공간이 부족해서 다른 공간으로 이사가는 것.

 Row Migration 현상이 많이 일어난다면,  PCTFREE값을 많이 주거나, 테이블을 재생성(Reorg)하는 등의 작업을 해서 줄이는 것이 좋다.(but, 공간낭비)




[녹음13]

5. Extent와 Segment

- Extent : 연속적으로 있는 block을 여러 개 묶어 놓은 단위.

- segment : extent를 여러 개 묶어 놓은 단위.

 

1) Extent

- 사용자가 테이블을 생성하면 데이터가 없더라도 기본값을 가지고, 데이터 파일에 연속적인 block을 묶어서 extent를 생성한다.

 (자동으로 64kb extent 1개가 할당되었고, 아래 extent는 8kb block을 8개 모아서 생성한 것.)


- 초기에 할당된 extent를 모두 다 쓰게되면 다시 재할당을 받는다.(추가적으로 extent가 할당되어 데이터가 저장됨.)

- 특정 테이블에 extent를 수동으로 추가 할당 (단점 : 공간낭비)(HWM이 자주 일어나는 것을 막기위함)

 : alter table 테이블명

   allocate extent (size 100k

   datafile '경로');



- 사용되지 않은 extent 반환 : alter table 테이블명 deallocate unused;

 

* HWM이란 ? (High water mark)

현재 어느 위치까지 사용하고 있다는 뜻으로 책갈피처럼 체크해두는 것으로, 공간을 미리 확보하기위해 HWM을 이동시키는 것을 HWM Bump up 이라고 한다.

 

2) Segment : oracle object 중에서 독자적인 저장공간을 가지는 것으로서, 데이터가 증가되면 용량도 증가되는 것들을 의미. (oracle object : oracle에서 관리자나 사용자가 데이터를 관리하기 위해 create로 만드는 모든 것.) (oracle object ⊃ segment)

- table, index, undo(rollback), temp, LOB 등

- segment는 extent들의 집합으로, 여러 개의 extent중 가장 첫번째 extent의 첫번째 block에 segment의 전체 요약정보인 segment header 정보가 들어간다.

 * object와 component의 차이.

 object : 우리 회사내에서만 공유한다.

 component : 다른 회사와도 공유한다.

 

 * object와 segment의 차이★★

 object : 데이터가 없고, 쿼리만 있다.(view에는 쿼리가 들어있으니까 크기가 같다. / trigger는 자동으로 하는 것.)

 segment : 데이터가 있다.


 

6. FLM(Free List Management)기법을 사용한 Extent관리.


* block들의 정보 관리하는 방식

 Dictionary Management Tablespace(DMT)

 

 : oracle 8버전까지 데이터베이스의 모든 데이터파일은 딕셔너리에서 쓰고있는 블록과 비어있는 블록을 중앙 집중적으로 관리하는데, 만약 사용자가 drop tablespace나 alter tablespace 등의 작업을 해서 dirty extent에서 free extent가 된다면 FET$와 UET$ 테이블을 업데이트해야만 하는데, block들의 정보를 딕셔너리를 사용해서 일괄적으로 관리하는 방식의 tablespace를 Dictionary Management tablespace라고 한다.

 

  FET$ (free extent table)

  free block 관리 -> DBA_FREE_SPACE에서 조회가능.

  UET$ (used extent table)

  dirty block 관리 -> DBA_EXTENTS에서 조회가능. 

 

 - 문제점 : 모든 데이터 파일의 free extent들을 FET$에서 일괄적으로 관리했는데 데이터가 한꺼번에 몰려서 free extent를 요청할 경우나 drop 명령 등의 수행결과로 FET$ 테이블을 업데이트 해야할 경우 심각한 병목 현상이 일어나게 된다.

 

 - 진행 과정 : 새로운 free extent가 필요한 상황이 되면 서버프로세스는 자신이 원하는 크기의 extent를 FET$테이블에서 검색한다. tablespace를 생성할 때 여러 개의 파일을 생성했을 경우 파일의 순서에 따라 원하는 사이즈나 그것보다 큰 extent를 순서대로 찾기 시도한다. server process는 FET$를 검색하다가 자신이 원하는 것보다 큰 사이즈의 첫번째 extent를 만날경우 표시해놓고 원하는 사이즈 찾을 때까지 검색한다.

 ->만약 끝까지 검색했는데 원하는사이즈의 extnet가 없을 경우 아까 찾아둔 큰 extent를 자신이 원하는 사이즈로 쪼개어서 사용하고, 나머지 부분은 빈 extent로 남겨두어서 다른 작업에 사용한다.

 ->이 과정 거친 후에도 원하는 free extent를 못 찾을 경우 비슷한 free extent를 합쳐서 확보한다.

 -> 그래도 못찾게 되면 추가로 신규 extent를 생성한다.

 => 원하는 extent 찾은 후 :: FET$, UET$, SEG$ 테이블에 해당 변경사항을 반영하고 segment header 부분에 추가된 extent 정보를 기록한다.

 - FET$나 UET$를 동시에 여러 명이 사용할 수 없는 이유 : 만약 서버 프로세스 A,B가 동시에 FET$를 보고 Free extent를 찾게 된다면 두 프로세스가 같은 블록을 동시에 사용하려고 할 수 있기 때문이다. -> 반드시 한번에 한명씩 사용하도록 하기 위해 딕셔너리에 ST락이라는것을 만들어서 ST락을 호가보한 프로세스만이 해당 딕셔너리에 들어갈 수 있도록 한다. -> oracle 8버전까지는 가능했지만 , oracle 8i버전부터는 문제가 된다.

 

 Locally Managed Tablespace(LMT)

 

 : DMT 방식은 안내데스크에만 자리배치도가 있어서 학생들이 한꺼번에 몰려올 경우 줄을 서서 기다리는 현상 발생.

: LMT 방식은 자리배치도가 각 강의장마다 있어서 직접 각자 강의장으로 가서 확인하면 되므로 속도가 훨씬 빠르다.

 

- LMT일 경우에도 9i는 Free list management(FLM) 방식으로 관리되고,

10g 부터는 Automatic Segment Space Management (ASSM)방식으로 관리된다.

 

 

 

(1) FLM (free list management) 방식에서 Free extent를 찾는 순서.

- FLM 방식으로 free extents를 관리하기 위해 free list와 free list group을 사용한다.

- free list는 Last In First out(LIFO) 방식으로 운영되며, Linked List로 만들어져 있다.

 * 사용자가 어떤 테이블에 새로운 데이터를 입력해야 할 경우

1. undo segment를 먼저 확보한다.

2. 해당 테이블 세그먼트가 저장되어 있는 tablespace의 data file에서 비어있는(free) extent내의 free block을 먼저 확보한다.

  -> 이 때  free extent를 찾기 위해 free한 block의 명단만을 가지고 있는 free list를 이용해서 관리한다.

3. 다른 프로세스가 쓰지 못하도록 lock을 설정한다.

4. 해당 block을 DB buffer cache로 복사한다.

5. DB buffer cache의 free buffer를 찾은 후 해당 buffer로 데이터파일의 free block을 복사한다.

 

_여기부터다른블로그참고_             

  Free list 

- linked list 형태로 구성되어 있으므로, 첫번째 free block을 찾아야 그 블록에 두번째 free block의 위치가 링크로 연결되어 있고, 세번째 free block의 위치는 두번째 block을 읽어야만 알 수 있다.

- free list는 segment 단위로 작성된다. (테이블 단위)

 

 * Free list의 종류

 Master Free list★

 (segment free list)

 해당 segment에 새롭게 할당된 free block이나 트랜잭션이 종료되어 dirty에서 free로 반환된 block들의 목록.

 (segment 생성시 storage(..freelists n..)설정으로 process free list를 지정하지 않으면 기본적으로 이 free list가 전체 블록들을 관리한다.)

 Process Free list

 해당 segment에서 트랜잭션이 끝나서 free block이 된 목록.

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

 ·Buffer Busy Watis 현상 발생→각 프로세스 별로 Free List를 분리 할당

- Master Free List에서 일어나던 경합이 줄어 성능 좋아짐

  But 기본값은 1 : DBA나 사용자가 별도로 값 지정하지 않으면 최악 성능 내는 상황됨

- (생성)  segment 생성시 Storage(.. FREEKISTS n ..) 로 개수 지정

 Transaction Free list★

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

 ·Free Block으로 변할경우 Block을 Master Free List로 즉시 반환

- 해당 Transaction 수행되는 중에는 Transaction Free List에 등록해두고
   자신의 Transaction 수행시 Free Block 필요하게 될 경우 우선적으로 사용

- 여기서 Free Block 못찾으면 Prcess Free List 검색, 해당 Transaction 끝나면(commit되면)
   이 리스트에 있던 Free Block들은 즉시 모두 Marter Free List로 반납

 


 

248p





 

 

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

[녹음14]

245p~

  

Dictionary management Tablespace (DMT) :속도가느려서 8i까지는 이걸 썼으나 9i부터는 Locally management tablespace (LMT) 를쓴다.

LMT - FLM (9i)

          ASSM(10g)

Print Friendly and PDF Posted by JJ*
: