본문 바로가기
OraclE

tuning block space usage

by 타마마임팩트_쫀 2012. 6. 13.

 

[출처] 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