달력

12

« 2024/12 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'DataBase이야기'에 해당되는 글 24

  1. 2010.07.22 Transaction - Block layer
2010. 7. 22. 16:12

Transaction - Block layer DataBase이야기2010. 7. 22. 16:12

TFT 동작 방식 분석
TFT는 트랜잭션 수행으로(일반적으로 DELETE 작업)인해 블록의 사용률이 PCTUSED 이하로 내려갈 경우, 해당 프리블록을 관리하는 리스트이다.

 Extent Control Header
  -----------------------------------------------------------------
  Extent Header:: spare1: 0      spare2: 0      #extents: 1      #blocks: 127   
                  last map  0x00000000  #maps: 0      offset: 4128  
      Highwater::  0x0180000d  ext#: 0      blk#: 3      ext size: 127   
  #blocks in seg. hdr's freelists: 2     
  #blocks below: 3     
  mapblk  0x00000000  offset: 0     
                   Unlocked
     Map Header:: next  0x00000000  #extents: 1    obj#: 55736  flag: 0x40000000
  Extent Map
  -----------------------------------------------------------------
   0x0180000a  length: 127   
  
  nfl = 1, nfb = 1 typ = 1 nxf = 1 ccnt = 3
  SEG LST:: flg: USED   lhd: 0x0180000c ltl: 0x0180000c 
  XCT LST:: flg: USED   lhd: 0x0180000a ltl: 0x0180000a xid: 0x0007.007.0000077b

FreeLists가 2개로 증가하였으며 TFL의 개수를 나타내는 nxf 값이 1로 증가하였음을 확인 할 수 있다. 그리고 XCT라는 부분이 추가 되었다.

 nfl = 2, nfb = 1 typ = 1 nxf = 0 ccnt = 0
  SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 
  SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 
  SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 

1개의 MFL과 2개의 PFL이 생성됨을 확인 할 수 있다. FREELISTS를 2로 설정함에 따라 2개의 PFL이 추가로 생성된 것이다. PFL은 PID값을 이용하여 사용할 프리리스트를 정하게 되므로 세션의 PID값을 확인해 보도록하자.

#blocks in seg. hdr's freelists: 1     
  #blocks below: 3     
  mapblk  0x00000000  offset: 0     
                   Unlocked
     Map Header:: next  0x00000000  #extents: 1    obj#: 55996  flag: 0x40000000
  Extent Map
  -----------------------------------------------------------------
   0x0180008a  length: 127   
  
  nfl = 2, nfb = 1 typ = 1 nxf = 0 ccnt = 0
  SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 
  SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 
  SEG LST:: flg: USED   lhd: 0x0180008c ltl: 0x0180008c 
End dump data blocks tsn: 7 file#: 6 minblk 137 maxblk 137

덤프를 확인해 보면 MFL을 제외한 2개의 PFL중에서 두번째 PFL이 사용되었음을 알 수 있다.
--PFL 할당 공식
select mod(12,2)+1 as PFL_Number from dual;

block header dump flg : - fsl : 0 fnx : 0x0 ver : 0x01

flg : (-)은 프리블록이 아니며, O는 프리블록이다.
fsl : TFL의 개수를 나타낸다.
fnx : 다음 프리블록에 대한 주소값을 나타낸다.

L1BMB Dump결과 분석

Start dump data blocks tsn: 8 file#: 7 minblk 9 maxblk 16
buffer tsn: 8 rdba: 0x01c00009 (7/9)
scn: 0x0000.0070ebc2 seq: 0x01 flg: 0x04 tail: 0xebc22001
frmt: 0x02 chkval: 0x4cf1 type: 0x20=FIRST LEVEL BITMAP BLOCK
nbits : 4 nranges: 1         parent dba:  0x01c0000a   poffset: 0     
   unformatted: 5       total: 8         first useful block: 3      
   owning instance : 1
   instance ownership changed at 
   Last successful Search 
   Freeness Status:  nf1 0      nf2 0      nf3 0      nf4 0      
 
   Extent Map Block Offset: 4294967295 
   First free datablock : 3      
   Bitmap block lock opcode 0
   Locker xid:     :  0x0000.000.00000000
   Inc #: 0 Objd: 55997 
  HWM Flag: HWM Set
      Highwater::  0x01c0000c  ext#: 0      blk#: 3      ext size: 8     
  #blocks in seg. hdr's freelists: 0     
  #blocks below: 0     
  mapblk  0x00000000  offset: 0    
--------------------------------------------------------
  DBA Ranges :
  --------------------------------------------------------
   0x01c00009  Length: 8      Offset: 0      

type: 0x20=FIRST LEVEL BITMAP BLOCK : L1BMB 임을 알 수 있다.
parent dba : L1BMB를 관리하는 L2BMB의 주소 값을 나타낸다.

select to_char(to_number('01c','XXXXXXXX'))/4 as fno,
       to_char(to_number('0000a','XXXXXXXX')) as bno
from dual;

7/10
L2BMB의 위치는 7번 파일의 10번째 블록이 된다. L1BMB의 위치는 7번 파일의 9번째 블록이 되므로 바로 다음 블록이 해당 L1BMB을 관리하는 L2BMB임을 알 수 있다. 

unformatted: 5       total: 8         first useful block: 3      
L1BMB에서 관리하는 블록의 정보를 나타낸다. total 8개의 블록을 관리하며, 포맷되지 않은 블록이 5개 이고 사용가능한 첫 번째 이터 블로그이 순번을 나타낸다.
   Freeness Status:  nf1 0      nf2 0      nf3 0      nf4 0     
블록들의 Freeness상태를 확인 할 수 있다. 블록들이 포맷되지 않은 상태에서 모두 0을 나타낸다.
DBA Ranges :
  --------------------------------------------------------
   0x01c00009  Length: 8      Offset: 0  

L1BMB가 관리하는 익스텐트의 정보를 나타냄. 현재 L1BMB는 0x01c0009블록부터 8 개의 블록을 관리한다.

인덱스 브렌치 블록에는 어떤 값들이 저장될까?
----- begin tree dump
branch: 0x180018a 25166218 (0: nrow: 2, level: 1)
   leaf: 0x180018b 25166219 (-1: nrow: 3 rrow: 3)
   leaf: 0x180018c 25166220 (0: nrow: 2 rrow: 2)
----- end tree dump

블록 타입 , 블록 주소, 포지션, nrow(해당 블록에 저장되었떤 최대 인덱스 엔트리 수 ), rrows( 현재 해당 블록에 저장된 인덱스 엔트리 수 인덱스 키 값이 삭제되면 줄어듬)
level(브랜치 블록 레벨->리프 블록은 내부적으로 0으로 인식함)

브랜치 블록의 DBA를 이용하여 블록 덤프를 수행해보자.

'DataBase이야기' 카테고리의 다른 글

Transaction - PGA Layer  (0) 2010.07.26
Transaction - Block Layer - ASSM  (0) 2010.07.23
Transaction-BlockLayer  (0) 2010.07.19
Transaction - Enqueue  (0) 2010.07.16
Transaction-Undo  (0) 2010.07.16
:
Posted by НooпeУ


Code Start Code End