Oracle 데이터 블록 구조
Tablespace
테이블 스페이스는 데이터베이스의 논리적 저장 구조 중 가장 포괄적이고 넓은 범위를 가진 형태로서 실제 테이터 베이스 각각의 물리적 파일들은 이 테이블스페이스에 N:1 형태로 연결되어 있다.
[ Tablespace ]
- 논리적으로 서로 관련된 데이터가 저장된 파일들을 묶어놓은 단위
- 물리적인 파일(실제파일)과 논리적인 저장단위를 서로 분리시키는 역할
- 데이터 파일 경로와 무관
DataFile 의 User01.dbf 와 User02.dbf는 각각 서로 다른 경로에 두 개의 파일로 나뉘어져 있지만 논리적으로는 서로 관련된 데이터를 가지는 하나나의 테이블스페이스에 속해 있으며, 추가로 더 나누거나 하나로 합쳐서 관리할 수도 있다. 즉, 논리적 저장 구조와 실제 저장되는 경로나 파일이름 등의 물리적 저장 구조는 서로 영향을 미치지 않는다.
Tablespace 종류
크게 3가지로 나뉘며 데이터베이스 생성 시 꼭 필요한 Tablespace 4개가 있다.
-
Permanent Tablespace
영구 테이블스페이스는 가장 일반적인 테이블스페이스로 데이터를 축적용도로 사용되는 공간. Undo와 Temporary와는 다르게 고의적으로 삭제하지 않는한 영구적으로 보존되는 객체들을 저장하기 위한 용도. USERS나 EXAMPLES 테이블스페이스처럼 임의의 이름을 지정하여 원하는 데이터를 저장할 수 있고 데이터베이스가 운영되기 위해 꼭 필요한 SYSTEM과 SYSAUX 테이블스페이스가 있다.
SYSTEM(필수 요소) 데이터베이스의 운영에 필요한 기본 정보를 담고 있는 Data Dictionary Table이 저장되는 공간으로 데이터베이스에서 가장 중요한 Tablespace. 중요한 데이터가 담겨져 있는 만큼 문제가 생길 경우 자동으로 데이터베이스는 종료될 수 있고 일반 사용자들의 오브젝트들을 저장하지 않는 것을 권장. 혹여나 사용자들의 오브젝트에 문제가 생겨 데이터베이스가 종료되거나 완벽한 복구가 불가능한 상황이 발생할 수 있다.
SYSAUX(필수 요소) SYSAUX Tablespace는 SYSTEM Tablespace의 보조로 기존에 SYSTEM Tablespace에 있는 다양한 유틸리티 및 기능들 분리하여 저장한 공간. SYSTEM과 마찬가지로 데이터베이스 운영에 필수적으로 있어야하는 Tablespace. SYSAUX Tablespace에 문제가 생길 경우 시스템상에는 별 다른 문제가 없지만, SYSAUX Tablespace에 저장되어 있는 요소들의 기능들은 사용할 수 없게된다. 대표적으로 AWR(Auto Workload Repository)기능이 있다.
-
Undo Tablespace(필수 요소)
읽기 일관성을 유지하기 위해 사용되는 Tablespace. 데이터베이스 운영 중 많은 사용자들에게서 DML 작업이 이루어진다. 이때 Rollback하게 되는 경우를 대비하여 DML 작업이 발생했을 때 수정 이전의 값에 대한 정보를 UNDO Segment에 저장한다. 이러한 Undo Segment에 대한 관리 공간으로 Undo Tablespace를 사용하게되고 데이터베이스 운영에 있어서 필수적으로 적어도 하나의 Undo Tablespace가 필요하다.
- Temporary Tablespace(필수 요소) Temporary Tablespace도 필수적으로 있어야합니다. 사용자 쿼리의 요청으로 정렬하는 작업이 필요한 경우 메모리에 부담을 덜어주기 위해 사용되는 공간입니다.
Segment
데이터베이스를 사용할 때 가장 많이 접근하게 되는 것은 테이블이며, 각각의 테이블들은 Segment에 해당한다. 세그먼트에는 Data, Index, Temporary, Undo 같은 종류들로 나뉘는데, 물론 Data Segment가 가장 일반적으로 사용되는 형태이다. Temporary Segment는 특정 SQL문이나 대용량 SQL 문의 실행을 위해 임시 작업 영역이 필요할 때 생성되었다가 끝나면 사라지는 형태로, 사용자가 지정할 수도 있고 시스템 기본값을 사용할 수도 있다. Undo Segment는 변경되기 전 데이터를 기록해두었다가 롤백될 때 되돌리는 역할을 한다.
[ Segment ]
- 테이블스페이스 내의 특정 유형의 논리적 저장구조로 할당된 영역
- 테이블, 인덱스 등의 오브젝트가 세그먼트에 포함
- 저장 공간을 가지는 오브젝트만을 세그먼트라고 함 (<> View, Sequence, Synonym)
표로 만들어진 부분의 전체 공간을 테이블스페이스라고 할 때, 색이 칠해진 부분은 Segment가 차지하고 있는 공간영역이라고 생각하면 된다. 주의할 것은 세그먼트는 실제 데이터 저장 공간을 가지는 오브젝트만을 지칭하는 것으로 View, Sequence, Synonym 등은 해당되지 않는다. 이들은 시스템 테이블스페이스에 정의만 저장된다. Segment의 구성 요소 중 HWM(Wigh Water Mark, 고수위) 가 있다.
HWM은 세그먼트 생성 이후 최대 사용량을 표시하는 세그먼트 구성요소 이다. 모든 세그먼트에는 고수위가 존재하며 테이블 전체 스캔시 고수위 앞에 존재하는 모든 데이터 블록을 엑세스한다. 고수위 뒤에 존재하는 데이터 블록에는 데이터 저장이 불가능하며 고수위 테이블 Truncate 또는 Drop에 의해서 이동 및 제거 가능하며, 오라클 10g 에서는 온라인 세그먼트가 축소 되었다.
Extent
Extent는 하나 이상의 연속된 데이터 블록의 모임이며(일정한 수의 연속된 Oracle Block 들), 세그먼트에 대한 공간 할당 단위이기도 하다. 그리고 위에서 테이블 스페이스는 여러 개의 물리적 파일로 이루어진다고 하였는데 Extent는 반드시 하나의 데이터 파일에만 존재할 수 있다.
[ Extent ]
- 하나 이상의 연속된 데이터 블록의 모임
- 세그먼트에 공간을 할당하는 단위
- 하나의 데이터 파일에만 존재
Extent가 Segment의 공간 할당 단위라고 했는데, 데이터가 추가되었을 때 Segment에 저장공간이 없을 경우 시스템 기본값 또는 지정한 크기만큼의 새로운 Extent 영역을 할당해주게 된다. Extent의 크기는 Segment 생성 시 STORAGE라느 파라미터를 이용해서 수동으로 지정할 수 있고 생략시에느 Tablespace의 기본 설정값을 적용받게 되며 최소값은 64KB 이다. 위 이미지 안의 표에서 진하게 표시된 부분은 하나의 Segment가 각각의 Extent로 이루어져 있음을 보여주기 위함이고, 중간 정도의 색은 기본 Segment의 영역, 가장 연하게 표시된 부분은 기존 Segment에 더 이상 저장공간이 없어 새롭게 Extent가 추가되었음을 나타내고 있다.
- Extent는 언제 할당(allocation)되는가?
Extent는 Segment의 생성이나 확장, 수동 Extent 할당 등의 경우에 새로운 Extent가 할당 Segment(Table,Index등)가 처음 생성될때 Initial Extent크기만한 Extent가 할당. Segment가 점차 커짐에 따라 Next Extent크기만한 Extent가 할당됨.
- Extent는 언제 de-allocaltion되는가?
Segment가 삭제되거나 Truncate 명령을 실행했을 때, 또는 수동 해제 시 할당 해제된다. Segment를 drop또는 truncate시킬때. Segment크기가 optimal보다 커졌을때(이경우는 rollback segment에만 해당)
Block
Block은 오라클의 기본 I/O 단위로서 모든 데이터는 Block으로 이루어져 있다(Data Block = Oracle Block = Logical Block = page). 기본 I/O 단위라는 말이 중요한데, DB에서 데이터를 검색할 때 아주 작은 데이터 하나만을 찾으려고 할 때도 최소한 하나의 Block에 저장된 전체 데이터에 대해서는 스캔이 이루어진다는 뜻이다. 운영체제에 따라 블록 크기의 시스템 기본설정이 다르며 64bit 운영체제에서는 보통 8KB가 기본 값이다(Oracle Block Size는 OS Block의 N배수로 이루어진다). 그리고 이 값은 모든 데이터 저장의 기본값이 되므로 처은 특정 값으로 설정했다면 데이터베이스를 변경하지 않는 이상 중간에는 수정할 수 없다.
[ Data Block ]
- 블록크기는 최소 2KB, 최대 64KB (32bit 운영체제는 기본 4kb)
- init.ora file의 DB_BLOCK_SIZE 로 설정하며 DB 생성 시 설정 (한 번 지정 후 변경 불가)
- Top-Down 방식으로 헤더 정보가 증가되고, Bottom-Top 방식으로 데이터 증가
위 이미지 안의 표에서, 위에서 다룬 Extent를 더 잘게 쪼개어 표현하고 있는데 모든 데이터는 블록으로 이루어져있음을 나타낸 것이고, 수평 화살표는 데이터가 쌓여가는 방향 및 풀스캔이 이루어질 때 진행하는 방향, 그리고 index라고 표시된 수직화살표는 인덱스로서 데이터 검색 시 블록을 찾아 접근함을 보여주고 있다.
데이터 블록 안에서는 아래 이미지와 같이 헤더 정보와 데이터 정보가 저장된다.