세그먼트
- 디스크 저장공간을 사용하는 객체
- 유형
- 클러스터 : 테이블을 저장하는 세그먼트 이며, b-tree방식과 hash 방식이 존재
- 테이블 : 데이터베이스 테이블을 위한 세그먼트로 가장 일반적인 유형
- 테이블 파티션/서브파티션 : 파티셔닝에서 사용하는 세그먼트 유형, 테이블 세그먼트와 매우 유사, 파티션 테이블은 한개 이상의 파티션 세그먼트로 구성, 복합 파티션 테이블은 한개 이상의 서브파티션 세그먼트로 구성됨.
- 인덱스 : 인덱스 구조를 저장
- 인덱스 파티션 : 파티션된 인덱스를 저장하는 세그먼트, 파티션된 인덱스는 한개 이상의 인덱스 파티션 세그먼트로 구성됨
- LOB 파티션, LOB 서브 파티션, LOB 인덱스, LOB 세그먼트 : 대형 객체, LOB 데이터를 저장하는 객체
- 중첩 테이블 : 중첩 테이블을 저장하는 세그먼트 유형
- 롤백과 Type2 언두 : 언두 데이터가 저장되는 세그먼트 유형
create table t( x int primary key, y clob, z blob);
오라클 11g release 2 부터는 데이터가 입력되지 않으면 세그먼트가 생성되지 않는다.
select segment_name, segment_type from user_segments;
create table t( x int primary key, y clob, z blob) segment creation immediate
select segment_name, segment_type from user_segments;
세그먼트 공간 관리
세그먼트 공간 관리 방법은 세그먼트가 속한 테이블스페이스의 파라미터로 결정됨.
- 수동 세그먼트 공간 관리 (Manual Segment Space Management)
- FREELISTS, FREELIST GROUPS, PCTUSED 및 기타 파라메터를 이용하여 수동으로 지정하는 방식
- 자동 세그먼트 공간 관리 (Automatic Segment Space Management)
PCTFREE만 설정하고 나머지는 오라클이 자동으로 관리하는 방식 - 오라클 9i에서 처음 소개된 방법
- tree 형태의 세단계 비트맵 블럭들로 프리 블럭을 관리하는 방법이다.
- 다음의 파라미터만 저장 공간 및 세그먼트의 특성에 영향을 준다.
- buffer_pool
- pctfree
- initrans
- maxtrans ( 9i에서만 사용 )
HWM ( High Water Mark)
사용된 적이 있는 Block 과 사용된 적이 없는 Block의 경계점을 의미하는 영역.
[HWM 아래의 블럭상태]
- 할당되었지만 현재 포맷되지 않고 사용되지 않은 블럭
- 포맷되었고, 데이터를 가지고 있는 블록
- 포맷되었지만, 데이터가 삭제되었기 때문에 비어있는 블럭
[HWM 위의 블럭상태]
- 포맷되어있지 않고, 아직 한번도 사용하지 않은 블럭
테이블 생성 직후
테이블 생성 직후의 HWM는 다음과 같다.
[그림 1-1] 테이블 생성 후의 HWM
테이블 사용 중
테이블 사용 중의 HWM는 다음과 같다.
[그림 1-2] 테이블 사용중의 HWM
테이블을 사용하다보면 하나의 테이블안의 블록 사용 모습과 HWM는 다음과 같이 보여지게 된다. 위 그림에서 보듯이 Low HWM를 확인할 수 있는데 이것에 대해 좀 더 자세히 알아보도록 하자.
Low HWM과 High HWM
그림 1-2에서 보면 확인할 수 있듯이, HWM가 2가지가 있는 것을 확인할 수 있다. 우리는 이것을 Low HWM와 High HWM라고 칭한다.
- Low HWM : 아래 영역의 블럭이 모두 사용중임을 나타내는 HWM
- High HWM: 아래 영역의 블럭들의 상태가 사용 중인 것도 있지만, unknown 상태도 있는 부분까지를 나타내는 HWM 즉, High HWM의 윗 부분의 블럭은 절대 쓰이지 않았고, 포맷되지 않았다는 것을 보장한다.
이렇게 HWM가 Low HWM와 High HWM로 나뉘어진 것은 10g 서부터 ASSM 기능이 추가되었기 때문이다.
FREELISTS
MSSM 방식에서 HWM 아래의 프리 블럭을 관리하는 방법
PCTFREE와 PCTUSED
- PCTFREE
- Data Segment에 속한 Block의 경우 해당 Block의 row 갱신으로 인한 성장에 대비해 예약해둔 공간(%)을 의미한다.
- Index Segment의 속한 Block의 경우 인덱스 블록에 추가적으로 데이터를 입력하기위해 예약해둔 공간(%)을 의미한다.
- 기본값은 10%이다.
- PCTUSED
- Data Segment에 속한 Block의 경우 Free List에서 제외된 Block이 다시 Free List에 포함될 수 있는 공간 사용율(%)을 의미한다.
- ASSM 방식으로 블록을 관리하는 경우 사용되지 않는다.
- 블럭이 추가되고 빠지게 되는 방법은 다음과 같다.
- 사용하려는 블록이 PCTFREE로 설정된 것보다 Free 영역이 많이 남아 있을 경우 계속 데이터가 저장된다.
- 사용하고 있는 블록의 Free 영역의 남은 %가 PCTFREE로 설정된 것을 넘어서게 되면 더 이상 데이터 추가가 이뤄지지 않는다.
- PCTFREE로 설정된 %로 데이터가 한번 저장된 다음 더 이상 데이터가 추가가 이루어지지 않게 되다가 PCTUSED로 설정된 값 이하로 해당 블록의 사용 공간이 남게 되는 경우 다시 FREELIST로 추가되고 해당 블록은 데이터 추가가 가능하게 된다. --> MSSM에서만 해당됨.
Row Migration
데이터가 변경되어 저장되어있던 블록에 변경분을 저장하지 못하게 되는 경우 전체 행을 새 블록으로 이동하고 포인터를 원래 Block에서 새위치를 가리키도록 한 것을 말한다. 행이 이전되는 경우 오라클은 데이터를 검색하기 위해 2개의 데이터 블록을 읽어야 하므로 I/O 성능이 저하된다.
Row Chaining
저장하려는 데이터가 너무 커서 하나의 행을 block안에 모두 저장하지 못하는 경우 발생하는 것으로 row를 조각으로 나누어서 여러 블록에 나누어 저장하는 것을 말한다. 각 행 조간은 전체 행을 검색하고 어셈블하기 위해 필요한 포인터와 함께 블록에 저장한다.
PCTFREE 와 PCTUSED 설정하기
- 높은 PCTFREE, 낮은 PCTUSED : 대량의 데이터가 갱신되고, 갱신되는 로우의 크기가 증가할 때를 위한 설정.
- 낮은 PCTFREE, 높은 PCTUSED : INSERT와 DELETE만 있는 경우의 설정 또는 update가 로우의 크기를 줄일때 사용하는 설정
LOGGING과 NOLOGGING
- 일반적으로 테이블은 LOGGING
- NOLOGGING은 리두의 생성없이 객체에 대한 수행을 하는 것을 말한다. 하지만 몇 작업에만 효과가 있다.
- CTAS
- 객체 생성
- direct path 를 이용한 SQL Loader 사용
- rebuild 작업
INITRANS와 MAXTRANS
- INITRANS
- Block에 생성되는 Transaction Slot의 초기 개수를 지정함.
- Data Segment의 경우 default는 2, Index Segment의 경우 default는 2 이다.
- MAXTRANS
- Block에 생성되는 Transaction Slot의 최대 개수를 지정함.
- 기본값은 255이다.
- Oracle 10g 부터는 무시된다.
INITRANS개수의 Transaction Slot은 Header 영역에 만들어 지고, INITRANS의 개수를 초과하여 트랜잭션이 접근하려고 하면 그 이후의 Transaction Slot은 Free 영역에 만들어 진다.