오라클

FREE LISTS와 FREE SPACE 관리

OEasy 2006. 10. 30. 20:00
BULLETIN CATEGORY
BULLETIN TOPIC 
: RDBMS 
: FREE LISTS와 FREE SPACE 관리

 * Free   List 는 해당 세그먼트가 다시 사용할 수 있는 block에 관한 list 이다.
Free  Block이 추가될 때는 Free   List의 Head 에 덧붙여진다.
 예를 들면 Block B5 가  Free List FL 에 있고 다른 B6 block이 FL에 덧붙여질 때 FL : B6 -> B5 즉, B6 가 free block으로 먼저 쓰여진다.
                     % 앞으로 사용할 약어  :   V1(V6.0 ~ V6.0.34)
                                                V2(V.6.0.35 ~ V7)

 * Free List 에는 다음과 같은 것들이 있다.
 * Txfl(Transaction Free List) : 모든 트랜잭션에 할당되는 Free List이다.  한 세그먼트에는 최소  16 Txfl 이 있고 이는 블럭이  꽉 찰 때 까지  필요한 만큼  증가한다.
  모든 프로세스는 해당 인스턴스에 주어진 Txfl에 접근 할 수 있다.
 * Prfl(Process  Free   List) : 하나의 프로세스에 할당되는 Free List 이다. 하나의로세스는 다른 프로세스에 할당 되어진 Prfl 을 사용하지 않는다.
 * Sgfl(Segment Free List) : Prfl과 같다.
 * Msfl(Master Free List) : 모든 프로세스가 사용 할 수 있도록 미리 할당되어진 Prfl이다.
  
 V1 에서의 Segment Header의 Block Format
 * 세그먼트는 연속된 블럭의 모음인 익스텐트로 구성 되어 있다. 세그먼트가  생성될 때 첫번째 익스텐트의 첫번째 블럭을 Segment Header 라고 한다. Segment Header는 Extent Control, Extent Map Table, Segment Header, Segment Free Space, Transaction Free Space로 이루어져 있다. Extent Control 과 Extent Map Table은 세그먼트에 할당된  익스텐트에 관한 정보를 준다.
Segment Header Control은  Transaction Free List 정보와 세그먼트가 생성 될 때 명시된 Instance List(nfb)와 Process Free List(nfl)의 갯수를 가지고 있다.
 * Instance   Free   List(infl) 갯수는 디폴트가 1 이며  1보다 클 경우 Prfl 의 갯수는  Prfl/Sgfl = nfb * nfl 이다.  nfb 는  init<SID>.ora 의 free_list_inst, nfl 은 free_list_proc 에서 지정된다.

  V1 과 V2 에서의 Block Format 차이점
* V6.0.35 에서는 기존의 Block Type 5에 Block Type 12가 추가됨으로써 Segment Header는 Type 5 또는 12가 가능하다. 이의 구별은 명시된 Free Group의 갯수에 의해 결정된다.
즉, Free Group의 갯수가 1보다 크면 Segment Header의 block Type은 12로 설정된다.
* V6.0.35 이상에서는 Free Lists 의 관련 정보를 Storage 항에서 표시할 수 있다.

              ....storage (freelists n freelist groups m)
* 장점은 데이타 딕셔너리에 Free   List의 정보가 저장 되어진다는 것이다. 즉 V1에서 처럼  Free Lists 를 바꾸기 위해 데이타베이스를 Restartup 할  필요가 없다.
* V1 에서는 Freelists를 위해 Segment Header인 한 블럭이 할당된다. 그러나 V2 에서는 각 Free  List Group 에 한개의  Free  List  Block 이 존재한다. 예를 들어, M=2 이면 Segment Header와  다음 2 block 이 할당 되어지는데  각 블럭은 Free List Group을 위한 것이다. ( 여기서 M 은 Free Group 이다).

  Mapping Function 과 Free Space 검색 알고리즘
(Mapping Function)
* Mapping Function은 단순히 Thread Number % Freelist Groups 와 Process Number % Process Freelists이다. 예를 들어 M=3,N=5는 3개의 Free List Groups 와 각각은 5개의 Process Free List 를 가짐을 의미한다.
            1(1 2 3 4 5)   2(1 2 3 4 5)  3(1 2 3 4 5)
* 임의의 프로세스가 인스턴스 2 에 접속되어 있고 Thread Number는 10 이고 Process Number는 26 이라고 가정하면 어떤 Freelist 가 할당되어질까?   이런 경우에는
            10 % 3 = 1 
            26 % 5 = 1    
즉, 첫번째 그룹의 첫번째 Prfl 을 선택하게 된다.

* 만약 인스턴스를 특정한 Freelist Block 에 할당하고자 할 때는 init<SID>.ora Parameter 인  Instance_number를 이용한다.

(검색 알고리즘)
  * V6.04 이하에서는 다음 순서를 따른다.
1. 자신의 Transaction Free List에서 Free List를 찾는다. 찾으면 #7, 아니면 #2로 간다.
2. Process Freelist 의 Free Space 를 찾는다. 찾으면 #7, 아니면 #3 으로 간다.
3. Commit된 Txfls를 찾는다. 만일 Commit되지 않은 Txfl Space를 발견하면 #4로 가고 아니면 각 Commit된 Txfl Space 를 한 Prfl에 할당한다. 만약 Prfl > Trfl 이면 어떤 Prfl는 Space를 얻지 못하고 Prfl < Trfl 이면 어떤 Prfl은 보다 많은 Space를 얻으며 #2 로 간다.
4. High Water Mark를 Bump Up할 수 없으면 #5로 가고 가능하면 원래대로 Space를 Prfl에 복사한 후 #2로 간다.
5. 데이타 딕셔너리에서 fet$를 검색하고 익스텐트를 세그먼트에 할당하고 #4로 간다.
만일 fet$ 에 Space 가 없으면 #6로 간다.
6. 에러발생. 테이블스페이스에 더이상 Space 가 없다.
7. Space 를  사용한다.
  * V6.0.35 이상에서는 다음 순서에 의한다.
1. 자신의 Transaction Free List에서 Free List를 찾는다. 찾으면 #8, 아니면 #2 로 간다.
2. Process  Freelist 의 Free Space 를 찾는다. 찾으면 #8, 아니면 #3 으로 간다.
3. Master Freelist를 검색한다. 만일 Space를 찾으면 Prfl에 Space의 조각을 복사하고 #2, 아니면 4로 간다.
4. Commit된 Txfls를 찾는다. 만일 Commit되지 않은 Txfl Space를 발견하면 #5, 아니면 각 Commit된 Txfl Space 를 Master Freelist 에 복사하고 #3으로 간다.
5. High Water Mark 를 Bump Up할 수 없으면 #6으로 가고 가능하면 Bump Up하고 Space를 Prfl 에 복사한 후 #2로 간다.
6. 데이타 딕셔너리에서 fet$를 검색하고 익스텐트를 세그먼트에 할당하고 #4로 간다.
만일 fet$ 에 Space 가 없으면 #7로 간다.
7. 에러 발생 테이블스페이스에 더 이상 Space 가 없다.
8. Space 를 사용한다.


Oracle Korea Customer Support Technical Bulletins