테이블유형

힙 구조 테이블 (Heap organized table)
  • 일반적인 표준 데이터베이스 테이블.
  • 힙(heap)은 일련의 저장공간이며, 크기에 맞는 임의의 공간에 저장.
    • 데이터를 추가할 때 데이터에 맞는 세그먼트 중 첫 번째로 발견된 가용공간에 데이터를 저장.
    • 데이터를 삭제하면 다음에 발생할 INSERT, UPDATE를 위해 재사용될 공간으로 반환.


인덱스 구조 테이블 (Index organized table)
  • 테이블을 인덱스 구조로 저장하는 방식으로, 각 로우를 물리적 순서에 따라 저장.
  • 기본 키 (primary key) 의 정렬된 순서로 저장한다.


인덱스 클러스터 테이블 (Index clustered table)
  • 클러스터는 물리적으로 하나의 데이터베이스 블록에 하나 또는 여러 개의 테이블 집합들을 저장할수 있다.
  • 동일한 클러스터 키 값을 갖는 모든 로우를 물리적으로 근접하게 저장한다.
  • 이러한 구조를 통해 두 가지 장점을 얻을수 있다.
  • 첫 번째는 테이블 대부분을 물리적으로 결합(Join)하여 저장할 수 있다.
    • 일반적으로는 하나의 블록에는 하나의 테이블을 저장한다고 생각할 수 있지만
    • 클러스터 테이블은 여러 개 테이블의 데이터를 동일한 블록에 함께 저장한다.
  • 두 번째는 동일한 클러스터 키 값을 갖는 모든 데이터(가령, DEPNO=10)를 물리적으로 함께 저장한다.
    • 데이터는 클러스터 키를 중심으로 묶여지고 클러스터 키는 B*Tree 인덱스를 이용하여 생성된다.


해시 클러스터 테이블 (Hash clustered table)
  • 이 테이블은 인덱스 클러스터 테이블과 유사하지만, B*Tree 인덱스 구조를 사용하지 않음.
  • 클러스터 키값을 해시하여 데이터베이스 블록에 저장하는 방식을 사용한다.
  • 데이터 자체가 인덱스 역할을 하며, 해시 키 값이 '=' 조건으로 사용되는 읽기 중심의 데이터에 효과적이다.


정렬 해시 클러스터 테이블 (Sorted hash clustered table)
  • 인덱스 구조 테이블(IOT)과 해시 클러스터 테이블의 조합된 테이블 유형이며, 오라클 lOg에 새롭게 추가되었다.
  • 데이터 로우는 고객번호로 해시 처리되고, 하나의 해시 키 안에서는 timestamp 등의 정렬된 순서로 저장되는 개념이다.
  • 예를 들어 선입선출 방식으로 처리되는 주문 접수 시스템에서는 정렬 해시 클러스터 테이블이 유용할것이다.


중첩 테이블 (Nested table)
  • 오라클에서 제공하는 객체-관계형 확장 기능의 일부분이다.
  • 부모/자식 관계의 테이블 구조를 시스템이 간단히 생성하고 관리하는 테이블 유형이다.
  • SCOTT 스키마에 있는 EMP 테이블과 DEPT 테이블의 관계를 EMP 테이블이 중첩 테이블이 되도록 설계하는 방식이다.
  • EMP 테이블은 DEPT 테이블의 자식 테이블이고 DEPT 테이블의 DEPTNO를 참조 키로 가진다.
  • 일반적인 EMP 테이블과 다른 점은 독립적 (stand-alone)이지 않은 테이블이라는 것이다.


임시 테이블 (Temporary table)
  • 임시 테이블은 하나의 트랜잭션 또는 한 세션 동안 생성된 데이터를 임시로 저장한다.
  • 현재 사용자의 임시 테이블스페이스에 필요한 만큼의 임시 익스텐트를 생성하여 사용한다.
  • 각 세션은 그 세션에 할당된 데이터만을 볼 수 있으며, 다른 세션에서 생성된 데이터는 전혀 볼 수 없다.


객체 테이블 (Object table)
  • 객체 타입을 기반으로 생성되는 테이블이다.
  • 이 테이블은 각 로우마다 시스템에서 생성된 REF(object identifier)와 같은 속성을 가지고 있다.
  • 객체 테이블은 힙 구조, 인덱스 구조, 임시 테이블의 특별한 유형이고, 중첩 테이블을 포함할수 있는 테이블 유형이다.


외부 테이블 (External table)
  • 데이터를 데이터베이스 내부에 저장하지 않고 운영체제가 관리하는 파일에 저장하여 관리하는 테이블 유형.
  • Extemal 테이블은 오라클 9i 이상 버전에서 제공되며, OS 파일을 DB 테이블처럼 조회할 수 있도록 한다.
  • 데이터베이스에 데이터를 가져오는 매우 유용한 수단이며 실제로 매우 강력한 데이터 적재 도구다.
  • 더 나아가 오라클 10g에서는 언로드 (UIUoad) 방식을 제공하는 Extenal 테이블을 소개하고 있다.
    • 이 방식은 데이터베이스 링크 없이 데이터베이스 간의 데이터 이동을 쉽게 처리할 수 있도록 한다.
    • 이 책의 15장 '데이터 로딩과 언로딩' 에서 좀 더 세부적으로 살펴볼 것이다.


테이블의 일반적인 특성

하나의 테이블은 최대 1,000개의 컬럼을 가질 수 있다.
  • 그러나 1,000개 컬럼으로 테이블을 구성하는 것은 좋지 않다.
    • 1,000개보다 훨씬 적은 컬럼 수로 구성되는 것이 효과적이다.
  • 오라클은 내부적으로 254개 컬럼 이상인 로우는 분리해서 저장하고,
    • 각 부분은 포인터로 연결하여 모든 컬럼의 요청 시 재조합한다.


테이블은 최대 로우 수에 제한을 두지 않지만, 주변의 다른 제한들에 의해서 제약을 받는다.
  • 하나의 테이블스페이스는 파일을 최대 1,022개 가질 수 있다.
  • 오라클 10g 버전에서는 파일 크기의 제한을 넘어서는 새로운 BIGFILE 테이블스페이스를 제공하지만, 여전히 파일 개수에는 제한이 있다.
  • 하나의 파일 크기가 32GB 라면
    • 하나의 테이블스페이스는 32,704GB(32GB*1,022 파일)까지 가능하다.
    • 이는 하나의 블록 크기가 16KB 일 때 2,143,289,344블록임을 의미하며,
    • 한 로우의 크기가 80-100바이트 정도일 때 한 블록당 160개의 로우를 저장하며,
    • 테이블스페이스 전체로는 342,926,295,040개의 로우를 의미한다.
  • 파티션 테이블이라면 이 숫자를 쉽게 배가시킬 수 있다.
    • 예를 들어 1,024개의 해시 파티션으로 구성된 테이블을 생각해보자.
    • 이 테이블은 1024 * 342,926,295,040개의 로우를 포함할 수 있다.
  • 351,156,526,120,960 개의 모든 로우를 삽입하기 전에 다른 실질적인 제한들에 의해 제약을 받게 될 것이다.


하나의 테이블은 컬럼의 순열(가능한 조합)만큼 인덱스를 생성할 수 있다.
  • 컬럼에 정의하는 함수의 순열을 포함하여 유일하게 조합되는 가능한 모든 순열을 의미한다.
  • 함수 기반 인덱스의 등장으로, 이론적으로는 인덱스의 개수에는 제한이 없다.
  • 인덱스가 많으면 INSERT 시에 성능이 느려질 수 있기 때문에 실제로 운영되는 인덱스의 개수에는 제한이 발생할 수밖에 없다


하나의 데이터베이스에서 생성할 수 있는 테이블 개수에는 제한이 없다.
  • 이 특성도 다른 실질적인 제약 때문에 의미 있는 한계를 갖게 된다.
  • 생성과 관리를 할 수 없기 때문에 아마도 몇 천개라면 몰라도 몇 백만 개의 테이블을 생성하는 것은 불가능할 것이다.