I. 테이블 종류 개요

  • 1. 힙 조직 테이블 : 가장 일반적인 테이블
  • 2. B*트리 인덱스 클러스터 테이블 : 이후 설명 참조
  • 3. 해시 클러스터 테이블 : 이후 설명 참조
  • 4. 인덱스 조직 테이블(IOT) : 이후 설명 참조
  • 5. 외부 테이블 : 이후 설명 참조


II. 클러스터링 테이블

1 클러스터링 테이블의 개념

1. 클러스터링의 개념
  • 1) 어떤 정해진 칼럼 값(클러스터 키)을 기준으로 동일한 값을 가진 하나 이상의 테이블의 로우를 같은 장소에 저장하는 물리적인 기법이다.
  • 2) 클러스터는 클러스터링한 칼럼으로 생성된 클러스터 인덱스를 가지며 기본적으로 테이블의 인덱스와 같은 역할을 한다. 단, 테이블의 인덱스가 테이블 로우 수 만큼 인덱스 로우를 가지지만 (단,인덱스키가 NULL값인 로우 제외) 클러스터 인덱스는 클러스터 키 값마다 인덱스 로우를 가진다.
  • 3) 클러스터는 테이블의 상위 개념이다. 즉 클러스터로 생성된 오브젝트 내에 테이블이 생성된다.
  • 4) 테이블이 생성되지 않은 클러스터에는 어떤 데이터도 입력할 수 없다.
  • 5) 지정된 위치에 저장되어야 하므로 검색을 제외한 다른 모든 경우에 부하를 발생시킨다.


2. 클러스터링의 종류
  • 1) 찾아가는 기법에 따라
    • 인덱스 클러스터 : 클러스터 인덱스를 경우하여 클러스터를 찾아간다.
    • 해쉬 클러스터 : 해쉬함수를 이용하여 클러스터를 찾아간다.
  • 2) 구성하는 테이블 수에 따라
    • 단일테이블 클러스터 : 하나의 테이블로 구성. 대량의 범위를 효율적으로 엑세스 하기 위해 사용한다.
    • 다중테이블 클러스터 : 두개 이상의 테이블로 구성. 연결효율(조인)을 높이기 위해 사용한다.


3. 잠깐 퀴즈
  • 1) 클러스터링이란 정해진 칼럼 값을 기준으로 동일한 값을 가진 하나 이상의 테이블의 로우를 같은 장소에 저장하는 논리적인 기법이다. (X)
  • 2) 하나의 테이블은 두개 이상의 클러스터에 저장될 수 있다. (X)
  • 3) 하나의 클러스터는 두개 이상의 테이블을 저장할 수 있다. (O)
  • 4) 아래 테이블이 COL1로 클러스터링 되어 있고 또 COL1에 인덱스가 있다고 가정할 때 테이블 인덱스 로우 수와 클러스터 인덱스 로우 수를 구하시오
COL1COL2COL3
AAA......
BBB......
BBB......
BBB......
CCC......
......
......
  • 테이블 인덱스 로우 수 : 5개
  • 클러스터 인덱스 로우 수 : 3개


2 단일테이블 클러스터링

1. 개념 설명
  • 단위클러스터 : 같은 클러스터키를 가진 로우들의 논리적 묶음으로 물리적인 단위인 블럭과는 다른 개념이다.
  • 하나의 블럭에 최대 2개의 단위클러스터가 존재할 수 있도록 클러스터 크기를 지정했다고 가정한다.
  • 1)번 블럭에는 101로만 채워져 있다. 이 경우 단위클러스터와 블럭은 일치한다.
  • 2)102의 경우 2,3 블럭에 걸쳐 저장되어 있다.
  • 3)번 블럭의 경우 102,123 두개의 단위 클러스터가 존재하고 있슴을 보여준다.
  • 4)번 블럭에는 124 단위클러스터만 있기에 언제든지 다른 단위클러스터가 들어 올 수 있다.
  • 5)번 블럭의 경우 212,220 두개의 단위클러스터가 들어가 있고 블럭에 여유공간이 없으므로 212,220의 키값을 가진 로우라 할지라도 다른 블럭에 저장되어야 한다.
  • 6)번 블럭의 경우 비록 여유공간이 있을지라도 220,301 이외의 키값을 가진 로우는 저장될 수 없다.


2. 인덱스와 클러스터링 비교
  • 1) 클러스터 스캔 (그림에서 102)
    • 클러스터 인덱스에서 클러스터 키 102를 찾고 그 인덱스에 있는 클러스터ID를 가지고 단위클러스터에 접근한다.
    • 클러스터링 테이블의 각 로우 헤더에는 클러스터ID를 가지고 있으므로 같은 ID를 가진 로우들을 스캔한다.
    • 더 이상 같은 ID를 가진 로우가 없다면 검색을 마친다.


  • 2)위와같이 같은 클러스터 키를 가진 로우들이 한 곳에 몰려 있기 때문에 같은 키 값을 가진 로우가 많으면 많을 수록,
  • 즉 분포도가 나쁠 수록 더 큰 위력을 발휘한다. 인덱스의 경우 분포도가 나쁘면 인덱스에서 테이블로의 랜덤 엑세스가 다량 발생하여 부하를 일으키는 반면, 클러스터의 경우 클러스터 인덱스에서 단위클러스터로 딱 한번 랜덤 엑세스가 발생할 뿐 이후는 스캔을 하기 때문에 훨씬 더 적은 비용이 든다.


  • 3)결국 인덱스와 클러스터는 상호보완적이다. 분포도가 좋은 칼럼의 경우 테이블 인덱스, 분포도가 나쁜 칼럼의 경우 클러스터 인덱스를 사용한다.


3 다중테이블 클러스터링

1. 개념설명

<DEPT 테이블>

DEPT_CDDEPT_NMCOL1
110Sales...
111Acount...
112Market...
.........
.........

<EMP 테이블>

EMP_NOEMP_NMDEPT_CD
7232Smith110
6782Ford110
4520Jones110
6745Ward110
7361Kim112
6382Park112
6733Black111
8705Martin111
.........
  • DEPT : EMP = 1 : 다 의 관계이다.
  • 조인키는 DEPT_CD 이다.
  • 클러스터키는 DEPT 테이블의 DEPT_CD 이다.
  • 테이블 현황
  • 1)단일테이블 클러스터 그림에서는 각 로우가 클러스터 키를 가지고 있는 것처럼 그렸지만 실제 클러스터 키는 블럭헤더에 한번만 저장된다 - 저장공간 절약
  • 2)각 클러스터 단위는 클러스터 키인 DEPT테이블의 DEPT_CD를 단위로 만들어지며 그 안에 그 DEPT_CD를 가진 EMP 테이블의 로우가 함께 저장된다. 따라서 조인에 탁월한 효능을 발휘한다.
  • 3)DEPT_CD='111'인 로우를 찾는 과정


  • 클러스터 인덱스에서 클러스터 키가 111인 인덱스 로우를 찾는다.
  • 인덱스에서 클러스터ID가 11임을 확인하고 찾고자 하는 단위클러스터가 어느 블럭에 있는지를 찾기 위해 블럭헤더의 클러스터ID와 비교한다.
  • 단위클러스터를 찾았다면 이후 클러스캔을 하면서 로우를 찾는다.
  • 더 이상 로우가 없다면 탐색을 마친다.


  • 4)다중클러스터링은 테이블이 1차정규화(테이블에 있는 어떤 칼럼이 원자값을 가지지 못하고 다중값을 갖고 있어 별도의 엔티티로 분리하는 경우)에 의해 하나의 테이블이 두개의 테이블로 쪼개진 경우 두 테이블의 로우를 동일한 저장소에 저장함으로써 마치 하나의 테이블인 것처럼 만들어 주는 효과가 있다.
  • 5)그러나 각 테이블의 유연성을 떨어진다. 부서테이블과 사원테이블의 조인시에는 강한 효과를 발휘하지만 이들이 각각 다른 테이블과 조인을 하는 경우 문제가 될 수 있다. 그러므로 실전에서는 특별한 경우에만 적용해야 한다.
  • 부서테이블이 판매테이블과 연결되는 경우 어떤 식으로든 클러스터 키인 DEPT_CD가 사용된다면 그리 나쁘진 않을 것이다.
  • 그러나 사원테이블이 사원가족테이블과 연결되는 경우 DEPT_CD는 전혀 사용되지 않을 가능성이 많고 따라서 클러스터링의 효과를 못 볼 것이다. (?) 클러스터를 사용하면서 별도로 테이블마다 인덱스를 설정하여 사용할 수 있지 않은가?


2.일반 테이블과 클러스터링 테이블 플랜 비교

1) 일반 테이블



SELECT *
FROM EMP A,DEPT B
WHERE A.DEPTNO=B.DEPTNO
AND B.DEPTNO=30

--------------------------------------------------
SELECT STATEMENT Optimizer Mode=CHOOSE		     	             	 
  NESTED LOOPS		                        	    	 
    TABLE ACCESS BY INDEX ROWID	SCOTT.DEPT		      	             	 
      INDEX UNIQUE SCAN	         SCOTT.PK_DEPT		     	             	 
    TABLE ACCESS FULL	         SCOTT.EMP	



2) 클러스터 테이블



-클러스터 생성
CREATE CLUSTER SCOTT_CLUSTER (DEPTNO NUMBER(2)) SIZE 1024

-클러스터 인덱스 생성
CREATE INDEX SCOTT_CLUSTER_IDX ON CLUSTER SCOTT_CLUSTER

-클러스터 DEPT 테이블 생성
CREATE TABLE CLUSTER_DEPT (
DEPTNO, DNAME, LOC, EMP_COUNT
)
CLUSTER SCOTT_CLUSTER (DEPTNO)
AS
SELECT 
DEPTNO, DNAME, LOC, EMP_COUNT
FROM DEPT
WHERE 1=0

-클러스터 EMP 테이블 생성
CREATE TABLE CLUSTER_EMP (
EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
)
CLUSTER SCOTT_CLUSTER (DEPTNO)
AS
SELECT 
EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
FROM EMP
WHERE 1=0

-CLUSTER_DEPT 에 데이터 입력
INSERT INTO CLUSTER_DEPT
(DEPTNO, DNAME, LOC, EMP_COUNT)
SELECT 
DEPTNO, DNAME, LOC, EMP_COUNT
FROM DEPT

-CLUSTER_EMP 에 데이터 입력
INSERT INTO CLUSTER_EMP
(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
SELECT 
EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
FROM EMP

-쿼리실행
SELECT *
FROM CLUSTER_EMP A,CLUSTER_DEPT B
WHERE A.DEPTNO=B.DEPTNO
AND B.DEPTNO=30

-실행계획
SELECT STATEMENT Optimizer Mode=CHOOSE		  	 	 	 	      	         	 
  NESTED LOOPS		  	 	 	 	      	             	 
    TABLE ACCESS CLUSTER	SCOTT.CLUSTER_DEPT	          ---2) 	             	 
      INDEX UNIQUE SCAN	SCOTT.SCOTT_CLUSTER_IDX	 ---1) 	 	 	 	      	        	 
    TABLE ACCESS CLUSTER	SCOTT.CLUSTER_EMP		 ---3)	

(1) 클러스터 인덱스를 경우하여 
(2) 클러스터를 읽고 
(3) 같은 클러스터 내에서 연결작업을 수행하고 있다	 



4 해쉬클러스터링

1.특징
  • 1) SIZE,HASHKEYS,HASHIS 파라미터를 변경할 수 없다.(해쉬 키의 갯수가 사전에 정의되어야 하면서도 변경이 불가능하다)
  • 2) 이퀄연산자(=)로만 엑세스해야 한다.
  • 3) 클러스터가 생성되면서 저장공간이 미리 할당된다.
  • 4) 지정된 단위 클러스터보다 많은 로우가 들어오면 오버플로우 영역에 저장된다.
  • 5) 칼럽 값이 고르게 분포되어 있지 않은 경우 해쉬키 값의 충돌이 일어난다.
  • 6) 인데스를 경유하지 않고 해쉬함수로 계산된 값으로 직접 테이블을 엑세스하므로 인덱스보다는 효율적인 엑세스를 할 수 있다.
  • 즉, 해쉬 값을 이용해 지정된 위치에 저장한다는 개념은 클러스터링 개념이고 그 해시 값을 이용해 테이블을 엑세스한다는 점에서 보면 일종의 인덱스이다.


2.활용범위
  • 1) 특징 1) 때문에 지속적으로 대량의 데이터가 증가하는 테이블에는 적용하지 않는 것이 좋다.
  • 2) 이퀄연산자로만 엑세스 해야 하므로 다양한 엑세스 형태를 같는 테이블에는 적용하지 않는 것이 좋다.
  • 3) 클러스터키 값이 균등한 분포를 하고 있는 경우가 아니면 오버플로우가 발생하거나 해쉬키 값의 충돌이 일어난는 것 또한 활용범위를 제한한다.
  • 4) 따라서 데이터 수가 일정하고 변할 가능성이 적은 소형테이블,코드성 테이블등에 적합하다.


3.해쉬클러스터 정의


CREATE CLUSTER SCHEMA.CLUSTER_NAME    ---1)
(COLUMN DATATYPE)                     ---2)
HASHKEYS integer                      ---3)
[HASH IS expression]                  ---4)
[PCTFREE integer]
[PCTUSED integer]
[INITRANS integer]
[MAXTRANS integer]
[SIZE integer [K|M]]                  ---5)
[STORAGE-CLAUSE]
[TABLESPACE tablespace_name]

  • 1)클러스터 명칭
  • 2)클러시터키 칼럼
  • 3)생성될 해쉬키 값의 갯수. 같은 클러스터 내에 저장되는 로우는 동일한 해시키 값을 갖는다.
  • 4)해쉬함수를 지정한다. 사용자가 지정할 수도 있고 기본적으로 제공되는 것을 사용할 수도 있다. 해쉬함수의 결과값은 양수이어야 한다. SYSDATE,USER,LEVEL,ROWNUM 같이 적용할 때마다 결과값이 변하는 것을 제외하고 다양한 SQL 수직을 포함할 수 있다. 그러나 사용자정의 함수를 해쉬함수의 일부로 사용할 수 없다.
  • 5)단위 클러스터에 저장될 로우들을 위해 확보한 클러스터의 크기이다. 이 수치로 단위 클러스터에 저장될 수 있는 총 로우의 수가 결정된다.