DBDBDEEP
Oracle 공간 관리 본문
* 테이블 스페이스 아래 있는 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%이다
- 데이터가 해당 값에 도달하면 더 이상 해당 블록에 새 행을 삽입할 수 없음
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 load로 Insert된 데이터들에 대하서만 압축이 가능하다.
- 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 |