본문 바로가기

wif LiNoUz/Oracle,Sql

index, table , segment 크기 예측

http://blog.naver.com/zoom7810/50028001703





1. 오라클 데이터 구조

1) 데이터 구조 관계

 

☞ Tablespace

- 데이터 1개 이상의 데이터 파일을 이용하여 생성

- 하부의 논리적인 구조로 1개 이상의 세그먼트로 구성

 

☞ Segment

- 테이블세그먼트, 인덱스 세그먼트, 언두 세그먼트, 롤백 세그먼트, 템포러리 세그먼트 등

- 사용자가 하나의 테이블을 생성하는 것은 하나의 테이블 세그먼트를 만드는 것과 동일

- 테이블이나 인덱스는 세그먼트의 한 종류

- 세그먼트는 하나 이상의 익스텐트로(Extent)로 구성되며 하나의 Extent는 연속적으로 할당된

   공간을 의미

- 모든 Segment 는 적어도 하나의 Extent 를 가지며 Rollback Segment의 경우엔 최소 2개의

   Extent를 요구

 

☞ Extent

- 일정한 수의 연속된 Oracle Block 들

- 일정한 수라는 의미는 사용자가 지정한 값

   (예)CREATE TABLE 문장에서 STORAGE OPTION중 INITIAL_EXTENT를 10K로 지정하면

    DB_BLOCK_SIZE가 2K 일 경우 5Block 이 됨.

   즉, 5개의 Oracle Block 이 하나의 Extent로 구성됨을 의미

 

☞ Oracle Block(=Data Block)

- Data Block 은 Logical Block, Oracle Block 또는 page라는 용어로 불림

- Oracle Block size는 OS Block 의 N배수로 이루어진다

- Database가 생성될 때 지정된 Oracle Block 은 다시 변경이 불가능 하다

- SGA의 Database Buffer에 I/O가 일어나는 기본단위가 된다

- init.ora file의 DB_BLOCK_SIZE로 지정한다

 

2) DMT(Dictionary-Managed TableSpace)와

    LMT(Locally Managed TableSpace)

(1) DMT(Dictionary-Managed TableSpace)

     - 오라클 8.1.5 이전에는 TableSpace에서 Extent 할당을 관리하는 방법을 오직 딕셔너리로

       관리되는 TableSpace만 존재

     - 하나의 테이블스페이스에 속하는 공간은 데이터 딕셔너리 테이블에서 관리

     - 이 방법은 새로운 Extent 의 할당이 필요한 시점에 오라클은 Data Dictionary Table에

        질의를 하여 어느 extent 가 할당 가능한지 파악 후 이를 할당하는 기법

     - 이 가용공간을 얻기위해 실행하는 연산은 Recursive SQL로 매우 비싼 연산

     ==> 자원에 대한 많은 경합이 발생

     ==> 딕셔너리에 대한 Free Space 확인이 있어야 하므로 Slow Operation의 특징

     ==> PCTFREE, PCTUSED, PCTINCREASE, FREELIST와 같은 저장 파라미터를 이용하여

           segment space에 일일이 관리

(2) LMT(Locally Managed TableSpace)

     - 데이터 딕셔너리 테이블에 의한 관리 대신에 지역적으로 관리되는 지역공간 관리방법 도입

     - 딕셔너리 관리로 생기는 오버헤드를 줄인 방법

     - 각 데이터 파일에 저장되는 비트맵이 Extent 를 관리하는데 사용

     - 하나의 Extent를 얻기 위해 해야 할일은 단지 비트냄의 한 비트를 '1' 로 Setting 하면 되는

       것이며 빈 공간은 반대로 '0' 으로 Setting 하면 됩니다.

     - Oracle 9i에서 기본적으로 TableSpace관리방법

     - 수행 속도 면에서 딕셔너리르 통한 방법보다 훨씬 뛰어남

     - autoallocate 문을 통해 extent 를 자동으로 할당 할 수 있으며 segment 의 경우

        segment space management auto 옵션으로 세그먼트 관리를 자동으로 할 수 있고,

        FreeSpace에 대한 colaesce(합치는 것) 이 불필요함

        [LMT의 특징 참고]

         + 공간 정보 관리를 위한 내부 작업이 감소한다

         + 데이터 딕셔너리 테이블에 대한 경합이 감소된다.

         + 익스텐트 관리와 관련된 관련 rollback 생성이 되지 않는다.

         + Tablespace에 대한 주기적인 coalesce작업을 하지 않아도 된다. 이것은 해당 테이블

            스페이스내의 모든 Extent에 대한 정보를 Bit로 표현하기 때문에 가능하다.

         + 해당 테이블스페이스 내의 모든 Extent 는 동일한 크기의 Extent를 할당하게 된다

(3) ASSM(Automatic Segment Space Management) 의 기능

    - 세그먼트 내의 영역 관리를 자동으로 처리

    - Oracle 9i 이전에는 FREELISTS, FREELIST GROUP, PCTUSED 같은 세그먼트 속성들이

      수동으로 구성되어야 했는데 ASSM을 사용하면 수동구성이나 재구성 작업을 할 필요가 없음

    - ASSM은 각 데이터 블록내의 사용량 관리를 위해 FREESISTS 를 사용하는 대신

      비트맵FREELIST를 사용함으로써 세그먼트내의 영역관리를 투명하게 만들어 주기 때문

    - ASSM은 데이터 블록의 영역 사용을 향상

    - 가변적인 크기를 가진 행과 함께 세그먼트를 위해 사용가능한 영역의 보다 나은 재사용

    - ASSM을 사용하면 비트맵의 다른 부분이 사용가능 영역 참조를 위한 직렬화를 없애주며

      동시에 사용될 수 있으므로 현재의 DML 처리 성능을 대폭 향상

         

2. ASSM(Automatic Segment Space Management)

1) Freelist 와 Bitmap Freelist

(1) Freelist

오라클 8i까지의 버전에서 segment 의 free block 들은 항상 freelist를 통해 관리 되었습니다.

block 들이 freelist로 연결되어있어 insert 가 필요하면 이 freelist를 segment header 에서부터

뒤지면서 블럭내에 빈공에 insert 하게 된다. 또한 freelist내의 free block에 대한 정보가

segment header 내에 정보를 저장하고 있는 것이 아니라 linked list 형태로 free block 이

다음 free block 을 지정하는 혀태라 쉽게 freelist에 대한 정보를 확인 하는 것도 불가능 했다.    

 

* MFL(Master Free List)

* HDR(Segment Header)

* HWM(High-Water Mark)

- Multiple-Freelist는 다량의 트랜잭션이 한곳에 집중될 때 기존보다 성능이 항샹

 

(2) Bitmap Freelist

- 테이블스페이스가 반드시 LMT 방식이어야 함

- 블럭헤더에 다음과 같은 4 비트정보를 포함하고 있음

   

 

(3) Multiple-Freelist 와 Bitmap-Freelist

- 여러개의 DML문이 하나의 세그먼트에서 발생한다면 먼저 메모리에 존재하는 데이터를 버퍼에 쓰

- 버퍼 영역에 있는 내용을 세그먼트에 쓰기 위해 해당 세그먼트의 FreeList를 검색하여 빈 데이터

  블록에 쓴다

- FreeList가 점유되어 데이터를 쓰고 있는동안 다른 DML문은 대기하게 되는데 이를

  buffer-busy-wait 라고 한다

- Bitmap-freelist 의 경우에는 freelist 자체가 각각의 블록내에 존재하기 때문에 이러한

  buffer-busy-wait현상은 전혀 없음

  [참고]

  buffer-busy-wait 현상이란 freelist가 점유되어 데이터가 쓰여지는 동안 다른 트랜잭션에서는

  버퍼에서 세그먼트 블록으로 데이터를 옮기지 못하고 기다리게 되는 현상

 

2) Online Segment Shrink(자동 세그먼트 정리)

(1) 기존의 세그먼트 관리

Online Shrink 는 Oracle 10g에서 새로 도입된 기능

- 빈번한 삽입 및 삭제 DML활동을 겪는 세그먼트들은 내부적으로 단편화(fragmented) 되고

   데이터 블록내를 사용 불가능한 영역을 만듬

- 이러한 데이터 낭비 현상을 방지 하기 위해 테이블 무브나 리오그 작업을 통하여 블럭 단편화

   현상을 없애야 함

(2) Online Segment Shrink

- 낭비된 영역을 가진 세그먼트들은 수축을 통해 영역 회수 가능

- 세그먼트 수축기능이란?

  + 낭비된 영역을 채우기 위해 행 조각들을 이동시키는 작업

  + 가능한 곳이면 어디든지 행 체인화를 없애주므로 해당 세그먼트에 대한 읽기 처리시의 성능향상

  + 수축 처리가 시행되는 동안 세그먼트 상의 활동이 계속될 수 있으며, 임시 데이터를 저장하기

    위해서 추가적인 영역 불필요

☞ [예] Shrink 수행

  

 

☞ [예] High Water Mark 의 이동

 

3. ASSM의 예측기능

1) 인덱스 크기 예측

(1) BMS 패키지의 create_index_cost 함수 이용

- 다음의 PL/SQL 문을 실행시키면 인덱스 크기를 예측 할 수 있다

declare

l_used_bytes number;

l_alloc_bytes number;

begin

dbms_space.create_index_cost(

   'create index idx_my_test01 on MY_TEST' || '(my_id, my_name) tablespace users',

    l_used_bytes,

    l_alloc_bytes

);

dbms_output.put_line('Used Bytes =' || l_used_bytes);

dbms_output.put_line('Allocated Bytes =' || l_alloc_bytes);

/

==>결과

Used Bytes = 8602126

Allocated Bytes = 14562223

 

(2) 인덱스 크기를 예측하기 위한 조건

- Segment Space Management 값이 Auto로 설정

   + sql문을 통해 헌재 자신이 생성한 테이블스페이스의 segment space management 의 값을

     확인할 수 있다.

      SQL> select tablespace_name, segment_space_management from dba_tablespace;

 

- 인덱스를 생성할 테이블에 대한 통계정보 생성

   + 마찬가지로 DBMS패키지의 gather_table_stats 함수를 사용하면 최신의 통계정보로

     업데이트 됩니다.

     SQL> exec dbms_stats.gather_table_stats('테이블 owner','테이블명');

 

2) 테이블 크기 예측

(1) create_table_cost 함수를 이용

- 다음의 PL/SQL 문을 실행시키면 테이블 크기를 예측 할 수 있다

declare

l_used_bytes number;

l_alloc_bytes number;

begin

dbms_space.create_table_cost(

   'USERS,   //테이블스페이스명

    50,          //1개의 row의 총합. 각 컬럼들의 바이트 총합

    1000,       //삽입될 row 의 개수

    l_used_bytes,

    l_alloc_bytes

);

dbms_output.put_line('Used Bytes =' || l_used_bytes);

dbms_output.put_line('Allocated Bytes =' || l_alloc_bytes);

/

==>결과

Used Bytes = 531264

Allocated Bytes = 89028

 

(3) 세그먼트 크기 예측

- 세그먼트 예측이 중요한 이유

   + 테이블이나 인덱스가 앞으로 어떠한 증가 추이를 보이는지 히스토리 테이터를 토대로

     예상함으로써 스토리지 관리를 보다 계획적으로 관리 할 수 있기 때문

   + 사용함후 : DBMS_SPACE 패키지의 OBJECT_GROWTH_THREND 함수를 통해 예상

   + OBJECT_GROWTH_THREND 함수는 AWR(Automatic Workload Repository) 에 의해

     수집된 통계정보를 바탕으로 세그먼트의 크기를 계산

- 조회

   select * from table(dbms_space.OBJECT_GROWTH_TREND('테이블스페이스명','테이블명'));