by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

5.2 테스트를 통한 ASSM 방식의 동작 원리 분석




ASSM방식의 동작원리

ASSM이란

Oracle 9i부터 지원된 프리블록 관리방법을 말한다.
FLM(Free List Management)방식과 달리 비트맵을 이용하여 프리블록을 관리한다.
PCTUSED, FREELISTS, FREELIST GROUP항목들이 자동관리된다.

ASSM의 BITMAP관리

Balanced트리구조와 유사한 방식으로 관리된다.

<그림작성 트리구조> : 데이터입력을 위해 프리블록이 필요할 경우 L3 -> L2 -> L1 순서로 할당

L1 BMB가 실제적인 데이터 블록의 프리상태를 관리하게 된다.
하나의 Extent안에서 연속된 block을 관리하게됨

  • 관리되는 연속된 블록의 개수는 세그먼트 크기에 따라 달라진다.
Segment Size Block Mapped(Range)
1M 이하 16 Data Block
32M 이하 64 Data Block
1G 이하 256 Data Block
1G 보다 큼 1024 Data Block

<표5-2>

ASSM도인스턴스그룹과 세션 PID값을 이용하여 프리블록에 대한 요청을 처리하여
세션간의 경합을 줄여준다.

<그림5-1>

===============================================================
테스트 진행 : 비트맵블록 확인
===============================================================
-- Version확인
SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

-- ASSM방식의 테이블스페이스 생성
create tablespace assmtbs datafile 'C:\oracle\product\10.2.0\oradata\orcl\test_blc02.dbf' size 50M
SEGMENT SPACE MANAGEMENT AUTO;
-- FLM방식의 테이블스페이스 생성
create tablespace flmtbs datafile 'C:\oracle\product\10.2.0\oradata\orcl\test_blc03.dbf' size 50M
SEGMENT SPACE MANAGEMENT MANUAL;


-- 테스트를 위한 테이블 생성
create table assm_test (name char(1000)) 
tablespace assmtbs
pctfree 10
pctused 40;

create table assm_test2 (name char(1000)) 
tablespace assmtbs
storage(initial 1m);

create table assm_test3 (name char(1000)) 
tablespace assmtbs
storage(initial 32m);


-- 익스텐트 정보 및 세그먼트 정보확인
select segment_name, header_file, header_block, blocks
from dba_segments
where segment_name='ASSM_TEST';

SEGMENT_NAME         HEADER_FILE HEADER_BLOCK     BLOCKS
-------------------- ----------- ------------ ----------
ASSM_TEST                      9           11          8

select segment_name, extent_id, file_id, block_id, blocks
from dba_extents
where segment_name='ASSM_TEST';

SEGMENT_NAME          EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
-------------------- ---------- ---------- ---------- ----------
ASSM_TEST                     0          9          9          8
===============================================================

세그먼트 헤더블록위치와 익스텐트 첫 번째 블록의 차이(2블록)가 존재하며
이 블록은 ASSM방식을 위한 비트맵 블록을 위해 사용한 것이다.

세그먼트헤더의 첫번째 익스텐트의 처음 세개의 블록은 비트맵블록이다.
세그먼트의 크기가 크면 첫번째 익스텐트의 비트맵블록의 개수가 3개 이상이 될 수 있다.

첫번째 익스텐트를 제외한 각각의 익스텐트의 첫 번째 블록은 세그먼트 크기에 따라 L1 BMB나 데이터블록이 된다.

===============================================================
테스트 진행 : L1 BMB 확인
===============================================================

-- Block Dump
alter system dump datafile 9 block min 9 block max 16;

-- Dump 내용

buffer tsn: 8 rdba: 0x02400009 (9/9)
scn: 0x0000.06812e39 seq: 0x01 flg: 0x04 tail: 0x2e392001
frmt: 0x02 chkval: 0xcc9d type: 0x20=FIRST LEVEL BITMAP BLOCK
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x07E8BC00 to 0x07E8DC00
7E8BC00 0000A220 02400009 06812E39 04010000  [ .....@.9.......]
... 중략
7E8DBF0 00000000 00000000 00000000 2E392001  [............. 9.]
Dump of First Level Bitmap Block
 --------------------------------
   nbits : 4 nranges: 1         parent dba:  0x0240000a   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: 154658 
  HWM Flag: HWM Set
      Highwater::  0x0240000c  ext#: 0      blk#: 3      ext size: 8     
  #blocks in seg. hdr's freelists: 0     
  #blocks below: 0     
  mapblk  0x00000000  offset: 0     
  --------------------------------------------------------
  DBA Ranges :
  --------------------------------------------------------
   0x02400009  Length: 8      Offset: 0      
  
   0:Metadata   1:Metadata   2:Metadata   3:unformatted
   4:unformatted   5:unformatted   6:unformatted   7:unformatted
  --------------------------------------------------------
===============================================================

type (0x20) : First Level Bitmap Block(L1 BMB)

parent dba (0x0240000a) : L1 BMB를 관리하는 L2 BMB주소값

unformatted(5), total(8), first useful block(3)
L1 BMB에서 관리하는 블록의 정보요약

  • L1 BLB에서는 8개의 블록을 관리하며 포맷되지 않은 블록이 5개임
  • 0~2번째 블록은 메타데이터를 관리하므로 사용가능한 첫번째 블록은 3번째임.

(nf1 0 nf2 0 nf3 0 nf4 0) Freeness Status분석
Freeness Status Block of Free Space
F1 0 ~ 25%
F2 25 ~ 50%
F3 50 ~ 75%
F4 75 ~ 100%
<표 5-3>Freeness Status

DBA Ragnes (0x02400009 Length:8 Offset:0)
L1 BMB가 관리하는 익스텐트정보를 관리함
현재의 L1 BMB는 0x02400009에서 8블록을 관리를 뜻함.

===============================================================
테스트 진행 : L2 BMB 확인
===============================================================
-- L2 BMB의 위치확인
select to_char(to_number('024','XXXXXXXX')) / 4 as fno,
     to_char(to_number('0000a','XXXXXXXX')) as bno
from dual;

FNO BNO
---------- -------------
         9 10

-- Block Dump
alter system dump datafile 9 block 10 ;

-- Dump 내용
buffer tsn: 8 rdba: 0x0240000a (9/10)
scn: 0x0000.06812e38 seq: 0x01 flg: 0x04 tail: 0x2e382101
frmt: 0x02 chkval: 0xdfcd type: 0x21=SECOND LEVEL BITMAP BLOCK
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x07E8BC00 to 0x07E8DC00
7E8BC00 0000A221 0240000A 06812E38 04010000  [!.....@.8.......]
...중략
7E8DBF0 00000000 00000000 00000000 2E382101  [.............!8.]
Dump of Second Level Bitmap Block
   number: 1       nfree: 1       ffree: 0      pdba:     0x0240000b 
   Inc #: 0 Objd: 154658
  opcode:0 
 xid: 
  L1 Ranges :
  --------------------------------------------------------
   0x02400009  Free: 5 Inst: 1 
  
  --------------------------------------------------------
===============================================================

type (0x21) : Second Level Bitmap Block(L2 BMB)

number(1) nfree(1) ffree(0) pdba(0x048000b)

  • nfree는 이 L2 BMB에서 관리하는 L1 BMB중 프리블록 정보가 있는 L1BMB의 수를 뜻함.
  • pdba는 이 L2 BMB를 관리하는 L3 BMB의 주소를 의미한다.

L1 Ranges (0x02400009 Free:5 Inst:1)

  • L1 Ranges 통해서
    : 이 L2 BMB에서 관리하는 L1 BMB의 주소를 확인
    : 각각의 L1 BMB의 최대 프리니스를 확인.
    : L1 BMB의 인스턴스 친화도를 확인
===============================================================
테스트 진행 : L3 BMB 확인
===============================================================
-- L3 BMB의 위치확인
select to_char(to_number('024','XXXXXXXX')) / 4 as fno,
     to_char(to_number('0000b','XXXXXXXX')) as bno
from dual;

FNO BNO
---------- -------------
         9 11

-- Block Dump
alter system dump datafile 9 block 11 ;

-- Dump 내용
buffer tsn: 8 rdba: 0x0240000b (9/11)
scn: 0x0000.06812e39 seq: 0x01 flg: 0x04 tail: 0x2e392301
frmt: 0x02 chkval: 0xf12e type: 0x23=PAGETABLE SEGMENT HEADER
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x07E8BC00 to 0x07E8DC00
7E8BC00 0000A223 0240000B 06812E39 04010000  [#.....@.9.......]
...중략
7E8DBF0 00000000 00000000 00000000 2E392301  [.............#9.]
  Extent Control Header
  -----------------------------------------------------------------
  Extent Header:: spare1: 0      spare2: 0      #extents: 1      #blocks: 8     
                  last map  0x00000000  #maps: 0      offset: 2716  
      Highwater::  0x0240000c  ext#: 0      blk#: 3      ext size: 8     
  #blocks in seg. hdr's freelists: 0     
  #blocks below: 0     
  mapblk  0x00000000  offset: 0     
                   Unlocked
  --------------------------------------------------------
  Low HighWater Mark : 
      Highwater::  0x0240000c  ext#: 0      blk#: 3      ext size: 8     
  #blocks in seg. hdr's freelists: 0     
  #blocks below: 0     
  mapblk  0x00000000  offset: 0     
  Level 1 BMB for High HWM block: 0x02400009
  Level 1 BMB for Low HWM block: 0x02400009
  --------------------------------------------------------
  Segment Type: 1 nl2: 1      blksz: 8192   fbsz: 0      
  L2 Array start offset:  0x00001434
  First Level 3 BMB:  0x00000000
  L2 Hint for inserts:  0x0240000a
  Last Level 1 BMB:  0x02400009
  Last Level II BMB:  0x0240000a
  Last Level III BMB:  0x00000000  => ?? 0x0240000c
     Map Header:: next  0x00000000  #extents: 1    obj#: 154658 flag: 0x10000000
  Inc # 0 
  Extent Map
  -----------------------------------------------------------------
   0x02400009  length: 8     
  
  Auxillary Map
  --------------------------------------------------------
   Extent 0     :  L1 dba:  0x02400009 Data dba:  0x0240000c
  --------------------------------------------------------
  
   Second Level Bitmap block DBAs 
   --------------------------------------------------------
   DBA 1:   0x0240000a

===============================================================

type (0x23) : PAGETABLE SEGMENT HEADER (L3 BMB)

L2 Hint for Inserts(0x0480000a)

  • 프리블록할당을 위해서 처음으로 검색대상이 되는 L2 BMB의 주소를 뜻함.

Extent Map

  • 세그먼트를 구성하는 익스텐트의 시작주소값
  • 각 익스텐트의 블럭 수를 표시함.

Auxillary Map

  • 각 익스텐트의 비트맵 블록 시작주소
  • 각 익스텐트의 실제 데이터 블록의 시작주소
    (풀스캔 등 데이터블록만 읽고 불필요한 블록을 읽고 싶지 않을 때)

Case 2. ASSM에서의 프리블록 요청 처리방식 분석

동시 Insert 세션들의 프리리스트 경합을 줄이기 위한 처리방식 분석

  • FLM에서는 FreeLists 속성을 통해 세션의 PID별로 PEL을 구분해사영하여 경합을 줄였음
  • ASSM 또한 세션의 PID별로 다른 블록을 사용하게 함으로써 경합을 줄이도록 하였음.
    순서 Process ID File ID Block ID
    1 12 18 14
    2 17 18 14
    3 20 18 12
    4 32 18 14
    5 30 18 12
    6 29 18 10
    <표>ASSM에서 Processid에 따른 입력결과
===============================================================
테스트 진행 : ASSM의 Insert block분산
===============================================================
-- A session
   insert into assm_test values('a');

   select rowid, name from assm_test;
   ROWID              NAME
------------------ ---------------------
AAAlwiAAJAAAAANAAA a
c
-- B session
   insert into assm_test values('b');

select rowid, name from assm_test;
   ROWID              NAME
------------------ ---------------------
AAAlwiAAJAAAAAOAAA b

-- C session
   insert into assm_test values('c');

select rowid, name from assm_test;
   ROWID              NAME
------------------ ---------------------
AAAlwiAAJAAAAAPAAA c

===============================================================

===============================================================
덤프관련 샘플
===============================================================
– treedump (object no)
alter session set events 'immediate trace name treedump level 82224';

– block dump(block no)
execute immediate 'alter system dump datafile 11 block 1816316' ;

– block dump
alter system dump datafile 12 block 75304 ;
alter system dump datafile 11 block min 9 block max 11;

– DBA file/block 찾기
select dbms_utility.data_block_address_file(50406952) fno,
dbms_utility.data_block_address_block(50406952) bno
from dual;

– DBA file/block 찾기
select to_char(to_number('048','XXXXXXXX')) / 4 as fno,
to_char(to_number('0000a','XXXXXXXX')) as bno
from dual;
===============================================================

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.