데이터 저장 구조

이름정의
블록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 하기 때문이다.
    • 즉, 특정 로우, 특정 컬럼만 골라서 읽을 수 없기 때문이다.