데이터 저장 구조


| 이름 | 정의 |
|---|---|
| 블록 | I/O의 최소단위 |
| 익스텐트 | 공간을 추가로 할당받을 때, 확장의 최소단위 |
| 세그먼트 | 데이터 공간을 사용하는 오브젝트 |
| 테이블스페이스 | 세그먼트를 담는 컨테이너, 여러 데이터 파일로 구성 |
세그먼트는 익스텐트의 집합이지만, 익스텐트끼리 서로 인접하지는 않는다. 예를 들어 어떤 세그먼트에 익스텐트 2개가 할당됐는데, 데이터파일 내에서 이 둘이 서로 멀리 떨어져있을 수 있다.
- 익스텐트:블록 = 1:M
- 세그먼트:익스텐트 = 1:M
- 테이블스페이스:세그먼트 = 1:M
블록 (=페이지)
- 대부분의 DBMS 는 블록 단위로 I/O 한다.
- 이는 하나의 레코드에서 하나의 컬럼만 읽더라도, 그것이 속한 블록을 통째로 읽게 됨을 뜻한다.
익스텐트
- 공간을 확장하는 단위다.
- 테이블이나 인덱스에 데이터를 입력하다가 공간이 부족해지면 해당 오브젝트가 속한 테이블스페이스 (물리적으로는 데이터파일) 로부터 추가적인 공간을 할당받는데, 이때 정해진 익스텐트 크기의 연속된 블록을 할당받는다.
- 한 익스텐트에 속한 블록은 서로 인접해 있다.
- 다만 익스텐트끼리 서로 인접하지는 않는다.
- 어떤 세그먼트에 할당된 두 익스텐트가 데이터파일 내에서 서로 멀리 떨어져 있을 수 있다는 뜻이다. -
세그먼트
- A를 B와 구분해서 세그먼트라고 부른다.
- 데이터 저장공간을 사용하는 오브젝트 (A): 테이블, 인덱스, 파티션, 클러스터, LOB
- 데이터 저장공간을 사용하지 않는 (B): 뷰, 시너님, 시퀀스, 함수, 프로시져, 트리거
- 뷰는 쿼리 문장을 담고 있는 가상의 테이블이므로 물리적인 저장 공간을 필요로 하지 않는다.
- 뷰를 조회할 때, 데이터 딕셔너리에 미리 저장해둔 쿼리 문장을 실행하는 것으로 결과 집합을 반환한다.
- 저장공간을 사용한다는 것은 테이블스페이스로부터 1개 이상의 익스텐트를 할당받음을 뜻한다.
- 세그먼트는 익스텐트의 집합이라고 말할 수 있다.
- 익스텐트 내 블록은 논리적으로 인접한다.
- 반면 익스텐트끼리 서로 인접하지는 않는다.
테이블스페이스
- 세그먼트를 담는 컨테이너로서, 여러 데이터파일로 구성된다.
- 각 세그먼트는 정확히 한 테이블스페이스에만 속한다.
- 하지만 한 테이블스페이스에는 여러 세그먼트가 존재할 수 있다.
- 한 세그먼트는 여러 데이터파일에 걸쳐 저장된다.
- 한 테이블스페이스가 여러 데이터 파일로 구성되기 떄문.
블록 단위 I/O
오라클을 포함한 모든 DBMS 에서 I/O 는 블록 단위로 이루어진다.
- SQL SERVER 등 다른 DBMS 는 ‘페이지’ 라는 용어를 사용한다.
즉 하나의 레코드를 읽더라도 레코드가 속한 블록 전체를 읽는다.
블록단위 I/O 는 버퍼캐시와 데이터파일 I/O 모두에 적용된다.
- 데이터파일에서 DB 버퍼캐시로 블록을 적재할때
- 데이터파일에서 블록을 직접 읽고 쓸 때 (DIRECT PATH I/O)
- 버퍼캐시에서 블록을 읽고 쓸 때
- 버퍼캐시에서 변경된 블록을 데이터파일에 쓸 때
데이터 딕셔너리에 저장된 테이블 및 컬럼 정보를 딕셔너리 캐시에 적재할 때는 ROW 단위로 I/O 한다.
- 딕셔너리 캐시를 ROW CACHE 라고도 부르는 이유다.
SQL 은 데이터를 정렬하는 과정에 모든 컬럼을 소트 공간 (또는 TEMP 테이블스페이스) 에 저장하므로 더 많은 공간을 사용한다. 모든 컬럼을 클라이언트에 전송하므로 네트워크 전송량도 더 많다.
두 SQL 이 읽는 블록 개수는 이하일 때 같다.
- TABLE FULL SCAN 할 때
- 인덱스를 이용할 때
- 블록 단위로 I/O 하기 때문이다.
- 즉, 특정 로우, 특정 컬럼만 골라서 읽을 수 없기 때문이다.