Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

DBDBDEEP

Oracle 공간 관리 본문

Oracle ADMIN

Oracle 공간 관리

Kihwane 2022. 7. 3. 18:32

* 테이블 스페이스 아래 있는 segment / extent / db_block 에 대한 관리에 대해 포스팅 한다.

 

-공간은 오라클 데이터 베이스 서버에 의해 자동으로 관리된다.

                                                  ㄴ-> 오라클 서버는 잠재적인 문제에 대하 alert 생성, 가능한 해결책을 제시한다.

 

Segment 관리

Segment  세그먼트 유형

- 테이블 세그먼트 : 테이블 세그먼트의 extent에 저장된다.

- 클러스터 세그먼트 : 클러스터 형식으로 만들면 Column (킷 값)을 기준으로 저장된다.

- 언두 세그먼트 : 오라클이 자동으로 만드는 세그먼트이다.

- 임시 세그먼트 : SQL 문에서 실행을 완료한 임시 데이터베이스 영역이 필요할 때 오라클 데이터베이스 서버에 의해 생성                              된다.

 

Deferred 세그먼트

첫 번째 행 삽입 전까지 세그먼트 생성이 지연된다.- 기본적으로 DEFFERD_SEGMENT_CREATION 초기화 파라미터를 TRUE로 설정하여 활성화 한다.- 실제로 데이터가 추가될 때 까지는 세그먼트를 생성하지 않는다.

- 디스크 공간을 절약할 수 있다.

- 응용프로그램 설치 시간이 줄어든다.

 

세그먼트 내에서 공간관리는 

 1. 비트맵 블록으로 추적된다

 2. ASSM ( 자동 세그먼트 공간관리 ) 지정으로 사용할 수 있다.

 

BMB : 비트맵 블록

-모든 extent마다 첫 번째 블록을 비트맵 블록으로 사용한다.

-extent마다 BMB가 있기 때문에 서버가 BMB를 쉽게 찾아갈 수 있도록 트리구조로 만든다.

 


 

Extent 관리

allocation

   1. dynamic allocation 

         - insert 가 일어날 때마다 자동으로 할당이 일어난다.

   2. static allocation

         - SQL> alert table test allocate extent;

         -  현재 다 차지 않았지만 DBA가 수동으로 대량의 데이터를 삽입전에 extent를 할당한다.

 

[ HIGH WATER MARK ]

- Extent 확장의 기준이다. 모든 세그먼트에 하나씩 존재한다.

- 1번에 5개의 데이터 블록 단위로 HWM 이동한다.

- Full Scan 수행 시, HWM 앞의 모든 데이터 블록을 액세스 한다.

- High Water Mark 왼쪽의 블록을 모두 채우면 HWM을 다음으로 밀고 다음 블록을 채운다.

- HWM 왼쪽은 데이터가 들어갔던 것이고 HWM 오른쪽은 데이터가 안들어 갔던 것이다.

 

테이블 삭제와 관련된 명령어에서 Extent와 HWM의 상태

1. DELETE from [tale_name] + Commit;

    - 수행 후 커밋 시 적용된다.

    - 할당받은 extent는 남겨두고 저장된 데이터를 삭제한다.

    - 기존에 할당된 영역 및 HWM의 위치가 그대로 존재하게 된다.

 

2.TRUNCATE table [table_name]

   - 수행 시 자동 Commit

   - HWM의 위치를 초기화 시키고 공간을 삭제하고 세그먼트를 할당 해제한다

   - 전체 데이터 삭제 시 Delete 보다 Truncate를 사용하는 것이 성능면에서 유리하다.

 

3. DROP table ~ purge 

   - 모두 다 삭제한다.

 

DB_BLOCK 관리

 

ASSM : Automatic Segment Space Management 

- 4개의 Section으로 블록 공간을 관리한다.

- FS1(0-25%)     FS2(25~50%)      FS3(50~75%)     FS4(75~100%)

- BitMap Block (노란색 부분) 에 Extnet 내의 블록 값이 어떤 것이 적혀있다.

- 블록의 사용가능 공간 레벨에 따라 해당 상태가 자동으로 갱신된다.

- Full 상태가 되면 블록에 더 이상 삽입 작업을 할 수 없다.

 

PCTFREE

SQL> create table test  (…) pctfree 20;  

                                                    ㄴ-> 남은 20%는 채우지 않는다. 더 이상 Insert 불가.  기본값은 10%이다

- 데이터가 해당 값에 도달하면 더 이상 해당 블록에 새 행을 삽입할 수 없음

     

빨간 선이 PCT 값이다.

1) PCT 비율이 적은 경우

- 기존 테이블 행 업데이트에 의한 확장을 위해 적은 공간을 확보

- 많은 데이터를 한 블록에 입력할 수 있음 (UPDATE가 적은 세그먼트에 적합)

 

2) PCT 비율이 큰 경우

- 블록당 적은 데이터가 입력되므로 같은 데이터를 입력하기 위해 많은 블록이 소요된다

- 데이터를 업데이트 할 때 수행속도가 증가한다.(Update가 자주 일어나는 세그먼트에 적합)

 

행 체인화 

[ 행 이전 ]  : 이미 저장된 데이터에 대해 UPDATE 할 때 공간이 부족해서 발생한다.

1. update로 인해 행 길이가 증가한다

2. 원래 정보를 기존 블록에 남겨두고, 실제 데이터는 다른 블록에 저장한다.

                         ㄴ-> 검색 시, 원래 블록에서 주소를 먼저 읽고 Migration 된 다른 블록을 찾아야 한다 (성능저하)

 해결책

1) PCTFREE 영역을 충분히 할당하여 행 이전이 발생하지 않도록 한다.

                ㄴ-> 하지만 PCTFREE가 너무 큰 경우 데이터 저장 공간 부족으로 효율성이 감소하니, 적절한 수준이 필요하다.

 

2) Table Move

 

3) Delete 후 다시 Inserting

 

 

[행 체이닝] : 애초에 저장을 할 때 공간이 부족해서 발생한다.

 

1. 데이터가 커서 여러 블록에 나누어 저장하는 현상이다.

                         ㄴ-> 2개 이상의 데이터 블록을 검색해야 하므로 성능이 감소한다.

2. Initial Row Piece (행 조각) 와 Row Pointer로 블록 내에 저장한다.

 

해결책

 DB_BLOCK_SIZE를 크게하여 최소화 가능하다.

               ㄴ-> 한번 지정하면 사이즈 변경이 어려우며, 무조건 크게 할 수 없다.


 

공간 관리 기법들

1. Table Compress (테이블 압축)

- 한 블록안에 Row를 저장할 떄, 압축해서 저장한다.

- 블록 하나만 가져와도 수많은 데이터가 있어서 I/O가 적게 필요하다

 

압축방법

 

1) 9i- 기본 테이블 압축

- Direct loadInsert된 데이터들에 대하서만 압축이 가능하다.

-  direct load insert(CTAS,INSERT /*+APPEND*/,sql loader direct)

                     Select * from..

- 일반적인 방식(INSERT INTO v VALUES)는 압축지원 안한다.

- 압축률 높고 CPU 오버헤드 낮음 / 기본 압축으로 테이블 생성시 pctfree=0

 

압축명령어

create table .. compress; <-- 11g 까지 가능하다.

                        row store compress <- 12c 부터 가능하다.

 

 

 

basic 압축 순서

1) PCT FREE 까지는 일반적으로 담는다

2) PCT FREE 까지 도달하면 압축을 진행한다.

3) 압축을 한 이후 들어온 것은 일반적인 방법으로 담는다.

4) 또 다시  PCT FREE에 도달하면 압축을 한다.

 

2) 11g - advanced 압축 (for oltp compress)

- 일반 DML에 의해서 들어온 데이터도 압축을 할 수 있다.

- 압축률은 Basic 보다 낮다.

- 모든 데이터에 대해 압축을 할 수 있는 것이 장점이다.

 

압축명령어

create table .. compress for oltp <-- 12c 이전

                        row store compress advanced <- 12c 부터

 

Advanced (DML 작업에 대한 고급 행 압축 순서)

- 고급 행 압축을 사용하면 데이터 블록의 행과 열에 있는 중복 값이 기호 테이블의 블록 시작 부분에 한 번 저장된다.

 

⦁ Compression Advisor (압축 관리자)

- 객체를 분석하여 서로 다른 압축 방법의 공간 절약 예상치 제공

- 응용 프로그램의 올바른 압축 레벨을 결정하는데 도움이 된다.

- 다양한 압축 전략을 제시한다.

   ㄴ-->  특정 데이터 집합에 적합한 압축 알고리즘을 선택한다.

   ㄴ-->  압축률이 높아지도록 특정 열을 정렬

   ㄴ-->  서로 다른 압축 알고리즘 간의 장단점을 알려준다

- OLTP압축에 유효

'Oracle ADMIN' 카테고리의 다른 글

언두 데이터 관리  (0) 2022.07.21
Oracle 공간관리 2  (0) 2022.07.21
Oracle 데이터베이스 저장 영역 구조  (0) 2022.07.03
Oracle 프로파일 생성 및 관리  (0) 2022.07.03
Oracle 권한 / Role  (0) 2022.07.03