[출처] http://blog.naver.com/kiyoun82?Redirect=Log&logNo=110069699348

* 공간 관리의 3단계

 

   - Files [ OS 의 files? ASM 의 files? raw paritions 의 files? ] 들을 tablespace 에서 disk 로 할당

             : SAME 방식 (중요 고민거리...)   (Striping And Mirroring Everything)

 

   - Extent : 크기 결정 (중요 고민거리...)

  

   - BlcoKs : Size     /   가득 채우기   /   Migration

 

 

  * LMT 와 DMT 는 10g workshop 앞부분 복습하기... 6장쯤...

 

  * Locally Managed Extents

 

  - Create a locally managed tablespace :

 

  SQL) CREATE TABLESPACE user_data_1

        2 DATAFILE '/home/oracle/oradata/orcl/lm_1.dbf' size 100m

        3 extent management local  [ (auto allocate) 가 되는 것 ]  <- LMT 지정

        4 uniform size 2m;

 

   % SYSTEM tablespace 가 DMT 이면   그 외 TS 생성시 DMT 와 LMT 둘 다 가능

                                            LMT 이면   그 외 TS 생성시 모두 LMT 가 되어진다.

 

   % 수동 DB 를 만들면 SYSTEM TS 는 DMT 로 생성

       자동 DB(DBCA) 로 만들면 SYSTEM TS 는 LMT 로 생성 되어진다.

 

   * Large Extents

 

 Pros (찬)  Cons (반) 
 - 동적으로 Extend 크기를 변환할 수 있다.  - 금새 용량이 바닥이 난다.

 - performance 에 조그마한 이익이 있다.

 - 사용안되어지는 부분을 포함하여 공간 낭비가 있다.

 - Enable the server process to read(멀티블럭) the entire extent map with a single I/O operation   ( server 는 extent max 과 single I/O 를 사용) 

 

 % extent map  : segment header 에 extent map 즉 시작과 끝에 대한 정보가 들어 잇따.

 

  * SYSTEM Tablespace 를 LMT 로 만들기.

 

  - SQL) EXECUTE DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL('SYSTEM');

             : 이것을 하기 전에 대한 준비 요구 조건

 

      - 요구 조건.

    :  system 은 RESTRICTED mode 여야 하고,

    :  SYSTEM , UNDO ,  TEMP 를 제외한 TS 들을 Read only mode 여야 한다.

    :  나머지를 redo only 로 바꾸고 위에 3개의 TS 를 read only mode 로 해 주어야 한다.

    :  위의 package 를 성공 하지 못했을 경우 만날 수 있는 ora 에러들.

 

->ORA-03240 : User's temporary tablespace same as tablespace being migrated

->ORA-10642 : Found rollback segments in dictionary managed tablespace

                                                             [ DMT 안에 롤백 segment 없어야 한다.]

->ORA-10643 : Database shoud be mounted in restricted mode and Exclusive mode

                                                             [ database 는 mount 에서 restricted mode 나 exclusive mode 여야 한다.]

->ORA-10644 : SYSTEM tablespace cannot be default temporary tablespace

                                                             [ SYSTEM TS 는 temp TS 가 default 일 수 없다.]

 

   % LMT 로 바꾸면 DMT 로 바꿀 수 없다.

 

   % 9i 전까지 temporary TS 의 default 는 SYSTEM TS 였다.

                       ->    그 이유는 명명된 (이름이 명시된) TS 는 system 뿐이 없었기 때문!!

 

 

   * Database Block

 

 

 

 - Block header : segment type ( table 이냐 index냐 ) / data block address(DBA) / table dictionary /

                          row dictionary (row 위치, row 하나하나당 2byte 정도 소모) /  transaction slot (개당 23 byte) 등 저장.

                          header 는 Top-down 방식

 

  - Row data : actual data (Bottom up 방식)

 

  - Free space : 중간의 영역. header 와 row data 가 자라는 공간이 된다.

 

   * Minimize Block Visit [ block 방문 횟수 적게 만들려면..]

 

 1) Using a larger block size [ block size 크게 만들기]

 2) Packing rows as closely as possible into block [하나의 블럭에 많은 row 넣기 / pctused,pctfree 사용]

 3) row migration 방지

 

 % 1)과 2) 를 하게 되면 block 경합이 많이 발생하게 된다.

 % 2) 하나의 블럭에 많은 row 를 넣게 되면, 3)의 row migration 의 발생 확률이 높아진다.

                          => 즉 상충 되는 이야기가 되기에 많이 고민하고 결정 하여야 한다.

 

  * DB_BLOCK_SIZE parameter

 

  - DB 생성시 한번 정해 주면 다시는 바꿀 수 없다.

  - OS block 의 정부배가 되어야 한다. (OS 블럭이 4k 라며 오라클 블럭은 8k 이렇게 되어야 한다. 작을 수 없다.)

  - I/O size 와 같거나 작아야 한다. (I/O size 가 16k 라면 오라클은 16k 와 같거나 작아야 한다.

 

  *

 

 Small Block Size

 Large Block Size 

     * Advantaged (혜택)

     * Advantaged (혜택)
 - block 경합을 줄일 수 있다.  - 공간에 대한 overhead 가 적다. [free list 줄고]
 - 길이가 짧은 로우들에 좋다.  - sezuential access 에 좋다.[scan 에 좋다.]
 - random access 에 좋다.  - very large row 도 가능
     * Disadvantaged ( 불합리)  - index reads 에 뛰어난 performance 를 보인다.
 - large space 에는 overhead 발생      * Disadvantaged ( 불합리)
 - 블럭당 row 를 몇 개 넣지 못한다.  - block 경합이 높아진다.
 - 같은 양의 I/O 가 있을 때에는 I/O 가 높아진다.  - 메모리 낭비[block이 8k row가 2 byte 면 7950byte 낭비)
     * Performance

     * Performance

 - OLPT 환경에는 small blocks 가 더 좋다  - OLAP ,DSS ,DW, ,BI 등에 좋다

 

  * Block Allocation

 

  -  공간을 필요로 하면 적절한 크기가 할당 되어져야 한다.

 

  -  할당 방식

    1. Free lists       2. ASSM [Automatic Segment Space Management]

 

     % 나쁜점 :

     PCTUSED 높여주면 BLOCK 을 꽉 채울 수는 있지만 조금만 지워져도 다시 free list 에 들어가서

     자리를 차지하게 된다.  insert 하려고 하는데 남아있는 용량이 별로 되지도 않는 애들 (pctused 가 높아서 온 block들)이

     기다리고 있으니깐 이것들 때문에 wait 와 I/O 가 발생 하게 된다.

 

   * Free list

                              -- Master list    /    Process  list    /    Transaction list

 

   - Segment header 에 free list 를 이루는 다음 블럭의 주소를 가지고 있다.

  

    * Block Space Management

 

    SQL) create talbe t1 (no1 number, no2 number)

          2  pctfree 20 pctused 40 initrans 2 maxtrans 5    -> Block space utilization 파라미터

          3  stroage (buffer_pool keep freelists 2)

 

[예전 3>  stroage (initial 64k next 64k buffer_pool keep freelists 2)   ]

[만일  4  tablespace users; 이렇게 해준다면 파란색의 값들만 인식 하고 나머지는 무시하게 된다.]

 

        % [ free lists 에 쓰여진 2, 3 은 추천 /  1(한개는)은 경합이 높아져서 별로 안좋다.]

 

   - For an index

  

        : PCTFREE : 새로 들어올 엔트리에 대한 공간 (중간중간 들어올 insert 를 위한 공간)

        : PCTUSED : 항상 0 으로 사용되어 지지 않는다.

 

   - For a table

 

        : PCTFREE : row update 를 위한 예약 공간

        : PCTUSED : free space 의 제일 작은 단계

 

  * ASSM

 

   - tablespace level 상태여야 한다.

   - LMT 로 되어있어야 한다.

   - ASSM 을 사용할 시에는 PCTUSED , PCTFREE , FREELIST GROUPs 는 무시된다.

   - Free-list segment 의 default 는 MANUAL 이다.

 

  * Migration $ Chaining

                        (workshop 1 볼 것!)

 

  * Migration 예방하기

 

    - PCTFREE

               : default : 10

               : undate 가 없는 곳에서는 0 으로 설정 [ 블록의 사용율을 확대 시키려고]

               : pctfee = 100 * UPD / (average row length)

     

           UPD : Average amount aded by updates, in bytes.

 

     - PCTUSED

               : 오직 free list 만을 위한곳

               : default : 40

               : pctused = 100 - pctfree - ( 100 * rows * average row length / block size )

 

             rows ] if 1, 이라면 insert 불가능에서 가능으로 변했을 때 평균 레코드 1개 받아들일 수 있는 여유

                        2, 3 이 됬을 때 insert 가능하게 되는 여유.

 

 

 

%  migration 이나 chaining 은 전체에 20~30 % 정도까지는 봐줄만 하다고 한다.

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

 

   * Migration 해결 방법

 

 - Export / Import :   

         - export the table

         - drop or truncate the table

         - import the table

 

 - Move table command :

         - ALTER TABLE EMPLOYEES MOVE

 

 - Online table redefinition 재생성

        -----------------------------------여기까지는 전체 이동 다음 부터는 문제 있는 애들만 이동

 

  - copy migrate rows

          -  Analyze 를 사용하여 migration 된 것을 찾는다.

          - 새로운 table 에 migration 된 row 들을 copy 한다.

          - 원본 table 에서 migration row 를 삭제 한다.

          - 원본 table 에 new table 을 copy 한다.

 

    % 책 14-31 참조.

 
 

 
  %-  compack 은 cursor invalidation 이 생기지 않게 해준다.   / During peak hours
 
   * Bigfile Tablespace (10 NF)
 
                : 자연스럽게 옛적에 사용하던 것은 small file TS 가 되어버렸다.
 
                                     TS    :     Datafile
                  Big file          1     :          1
                  Small file       1    :        1022
 
   - 40억 block  을  가질수 있다.
          block 이 2k 라면
     40억 block    *   2k         =     8T
     40억 block    *   4k         =     16T
     40억 block    *   8k         =     32T
     40억 block    *   16k        =     64T
     40억 block    *   32k        =     128T
 
 

 
 
   * Using Bigfile Tablespaces
 

 Database Block Size

Recommended Maximum

Number of Extents 

 2KB

100,000 

 4KB

200,000

 8KB

400,000

 16KB

800,000

 
 
 % 8T  / 100,000 ->  80M    :   16T / 200,000 ->  80M     :    32T  / 400,000  -> 80M 
     32T / 800,000 ->  80M      -> 결국엔 80M 보다 크게 만들어 주어야 한다.    

'OraclE' 카테고리의 다른 글

DBMS_STATS  (0) 2012.06.13
DBMS_STATS 패키지  (0) 2012.06.13
ALTER TABLE 에 있어서의 SHRINK 와 MOVE (10g)  (0) 2012.06.13
[펌] INBOUND_CONNECT_TIMEOUT  (0) 2011.09.15
Resumable Space Allocation  (0) 2011.01.27

Bulletin No: 18489

Product: ORACLE SERVER

Subject: Automatic Space Segment Management (BMB:BitMap Blocks)에 대해서 (9i)

Automatic Space Segment Management (BMB:BitMap Blocks)에 대해서 (9i)

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

 

PURPOSE

-------

기존에 freelist로 관리되던 segment내의 free block에 대해서, 9i부터 새로 소개된 automatic space segment 관리에 대해서 살펴본다.

 

Explanation & Example

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

1. freelist를 통한 free block관리

 

8i까지에서, segment의 free block들은 항상 freelist를 통해 관리된다. PCTUSED아래로 채워진 block들이 freelist로 연결되어 있어서, insert가 필요하면 이 freelist를 segment header에서부터 뒤지면서 블럭내의 빈 공간에 insert를 하게 되는것이다.

 

같은 table에 대해서 insert 트랜잭션이 동시에 많은 경우 table storage의 freelists 값을 증가시켜야 하고, OPS의 경우 node갯수를 고려하여 freelist groups을 지정해야 하는 등 freelist와 관련하여 DB Admin이 고려하여야 할 tuning point가 존재하여 왔다.

 

또한 이 freelist내의 free block에 대한 정보가 segment header내에 전체 정보를 가지고 있거나 dictionary table에 정보를 가지고 있는 것이 아니고, linked list 형태로 free block이 다음 free block을 지정하는 형태라 쉽게 freelist에 대한 정보를 확인하는 것도 불가능하다.

 

이렇게 전체 freelist에 대한 정보를 쉽게 확인하지 못하는 이유로, table에 대한 reorganization을 결정하는 기준을 정하기도 쉽지 않았고, db내에서 space 활용도 최적이 되지 못한다.

 

이러한 space관리에 대한 문제점을 극복하기 위해 9i에서 제시된 것이 ASSM (automatic space segment management)이다.

2. Automatic Space Segment Management

 

9i에서 제시된 이 ASSM방식은 segment에 할당된 space를 bitmap으로 관리한다.

 

ASSM 방식을 이용하려면 반드시 locally managed tablespace여야 하며, 다음과 같이 'segment space management auto'를 지정하면된다.

 

SQL>CREATE TABLESPACE test_tbs

DATAFILE '/oracle/data/data01.dbf' SIZE 50M

EXTENT MANAGEMENT LOCAL

SEGMENT SPACE MANAGEMENT AUTO;

 

auto가 아닌 manual로 지정되게 되면 이전과 같이 freelist방식을 사용하게 되며, DBA_TABLESPACES view의 SEGMENT_SPACE_MANAGEMENT column을 통해 AUTO인지 MANUAL방식인지 확인 가능하다.

이렇게 생성된 tablespace내에 table이나 index를 생성하게 되면 segment header 외에 추가적인 BMB (BitMap Blocks)라는 것이 생기게 된다. 이 BMB에는 할당된 block들의 space정보를 4 bit를 이용하여 다음 6가지 상태를 나타내는 bitmap 정보를 가진다.

 

(1) 75% 이상의 free space를 가지는 block

(2) 50% 이상 75% 미만의 free space를 가지는 block

(3) 25% 이상 50% 미만의 free space를 가지는 block

(4) 25% 미만의 free space를 가지는 block

(5) 꽉 찬 block

(6) 한번도 사용하지 않아 format 되지 않은 block

 

이렇게 ASSM 방법을 이용하여 space를 관리하게 되면 free block에 대해서 좀 더 상세한 정보를 바탕으로 space utilization도 높아지고, freelist를 타고 다음다음 block을 access하는대신 BMB를 참고로 적당한 block들을 선택하기 때문에 space에 관한 성능도 좋아진다.

 

또한 ASSM의 경우 해당 tablespace에 생성된 segment들은 freelists, freelist groups, pctused등은 지정하여도 무시되는데, 이것은 space관리 작업을 단순화시킬뿐 아니라, 특히 freelist groups 지정이 성능에 영향을 미쳤던 RAC에서 큰 도움이 된다. 그외에도 BMB를 동시에 다른 트랜잭션이 다른 part를 access 하는 것 또한 성능에 도움을 준다. 오라클은 internal benchmark 자료에 따르면 RAC에서 최적화된 freelist 관련 parameter를 지정한 상태에서 3백만건 데이타 insert 작업에 대해서, ASSM과 일반 manual 방법을 비교해 본 결과 35 % 정도 ASSM사용이 성능향상에 도움이 되었다.

 

이때 주의할 점은, locally managed tablespace와 이 ASSM 방식간에 혼동을 일으키는 경우가 종종 있다. 이것은 locally managed tablespace와 ASSM이 둘 다 bitmap방식을 통해 space를 관리한다는 측면때문 일 것으로 보인다.

ASSM방식을 사용하려면 미리 이야기한대로 locally managed tablespace에서만 사용가능한데, 기본적으로 locally managed tablespace는 dba_free_space에서 확인되는 할당되지 않은 space에 대한 관리이고, ASSM은 일단 segment내에 할당된 extent안에서 block내의 free space에 관한 것이다.

locally managed tablespace에 관한 좀 더 자세한 사항은 <Bulletin No: 11860>이나 <Bulletin No: 18261>를 참조하도록 한다.

 

3. space정보 확인 방법

 

ASSM방식을 사용하지 않고 freelist방법을 사용하는 경우 segment에 할당된 extent 내에 free block을 확인하는 방법은, table analyze후 DBA_TABLES의 EMPTY_BLOCK를 확인하거나 DBMS_SPACE.UNUSED_SPACE procedure를 이용하는 방법이 존재한다. 그리고 이 두 가지는 같은 정보를 보여준다.

 

ASSM으로 관리되는 table이나 index에 대해서는 DBA_TABLES의 EMPTY_BLOCKS와 DBMS_SPACE.UNUSED_SPACE가 다른 값을 나타낼 뿐 아니라, ASSM의 정확한 정보를 모두 나타내지 못하므로 새로이 소개된 DBMS_SPACE.SPACE_USAGE procedure를 이용하면 된다.

이 세가지 방법이 나타내는 각 정보에 대해서 자세히 살펴본다.

 

먼저 DBMS_SPACE.SPACE_USAGE의 사용방법이다. 아래에 예로 SCOTT user의 TEST table에 대해서 예로 들었다. TEST table은 ASSM 방식으로 관리되는 table이다.

 

SQL> declare

2 v_unformatted_blocks number;

3 v_unformatted_bytes number;

4 v_fs1_blocks number;

5 v_fs1_bytes number;

6 v_fs2_blocks number;

7 v_fs2_bytes number;

8 v_fs3_blocks number;

9 v_fs3_bytes number;

10 v_fs4_blocks number;

11 v_fs4_bytes number;

12 v_full_blocks number;

13 v_full_bytes number;

14 begin

15 dbms_space.space_usage ('SCOTT', 'TEST', 'TABLE', v_unformatted_blocks,

16 v_unformatted_bytes, v_fs1_blocks, v_fs1_bytes, v_fs2_blocks,

17 v_fs2_bytes, v_fs3_blocks, v_fs3_bytes, v_fs4_blocks,

18 v_fs4_bytes, v_full_blocks, v_full_bytes);

19 dbms_output.put_line('Unformatted Blocks = '||v_unformatted_blocks);

20 dbms_output.put_line('FS1 Blocks = '||v_fs1_blocks);

21 dbms_output.put_line('FS2 Blocks = '||v_fs2_blocks);

22 dbms_output.put_line('FS3 Blocks = '||v_fs3_blocks);

23 dbms_output.put_line('FS4 Blocks = '||v_fs4_blocks);

24 dbms_output.put_line('Full Blocks = '||v_full_blocks);

25 end;

26 /

 

Unformatted Blocks = 0

FS1 Blocks = 0

FS2 Blocks = 0

FS3 Blocks = 0

FS4 Blocks = 1

Full Blocks = 9

 

PL/SQL procedure successfully completed.

 

이때, FS1 ~ FS4가 의미하는것은 다음과 같다.

FS1 : 0-25%의 free space를 가진 block

FS2 : 25-50%의 free space를 가진 block

FS3 : 50-75%의 free space를 가진 block

FS4 : 75-100%의 free space를 가진 block

 

이예에서 SCOTT user의 TEST table에 data를 insert시키고 analyze후 조회하니 다음과 같은 결과가 나왔다. (단, DBMS_SPACE.SPACE_USAGE사용을 위해서는 analyze를 수행할 필요가 없다.)

 

아래의 예에서 보면 첫번째로 DBA_TABLES의 EMPTY_BLOCKS와 DBMS_SPACE.UNUSED_SPACE에서 보여주는 값이 서로 다르다. 그리고 정확한 정보를 주는 DBMS_SPACE_SPACE_USAGE에서는 75%이상 비어있는 block이 한개, full인 block이 9개로 나타난다. 그럼 전체 13개의 block중 3개의 block은 어떠한 block 일까? 이 3개의 BLOCK을 DBA_TALES에서는 EMPTY_BLOCK로 분류하였다.

 

이 세개의 block는 바로 space를 bitmap으로 관리하는 BMB 들이다.

 

DBA_TABLES DBMS_SPACE.UNUSED_SPACE DBMS_SPACE.SPACE_USAGE

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

BLOCKS | EMPTY_BLOCKS TOTAL_BLOCKS | UNUSED_BLOCKS FS4 Blocks | Full Blocks

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

10 3 13 0 1 9

 

Reference Documents

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

 

<Note:180608.1> Automatic Space Segment Management in RAC Environments

<Note:149516.1> BMB versus Freelist Segment: DBMS_SPACE.UNUSED_SPACE

and DBA_TABLES.EMPTY_BLOCKS


'OraclE' 카테고리의 다른 글

data file size 줄이기  (0) 2008.10.07
Oracle Data Pump(Oracle 10g)  (0) 2008.10.01
DBA Table / View 정리  (0) 2008.09.17
오라클에서 시퀀스(SEQUENCE) 사용하기  (0) 2008.09.17
Windows 32bit OS 에서 Oracle Memory Sizing  (0) 2008.08.13

+ Recent posts