View Source

h3. 1.3.1 클러스터링 테이블의 개념

* 인덱스의 단점
\\
** 분리형의 단점 : 대량의 데이터를 범위처리 시 많은 랜덤 액세스를 발생시키는 부담이 있음
** 일체형의 단점 : 특정 액세스에서는 랜덤 액세스의 부하가 감소하나, 다양한 액세스를 모두 수용하지 못하면서 오히려 더 많은 부담이 발생

\\
* DBMS에서의 클러스터란 테이블이나 인덱스처럼 저장공간을 가지고 있는 하나의 오브젝트
* 클러스터는 테이블의 상위 개념(EX : 테이블은 인덱스의 상위 개념임)
* 클러스터로 생성된 오브젝트 내에 테이블이 생성됨
* 테이블이 없는 클러스터는 어떤 데이터도 입력할 수 없음
* 다중 클러스터와 단일 클러스터로 구분됨
\\
** 다중 클러스터 : JOIN에 필요한 컬럼을 클러스터 키로 생성, 같은 클러스터내의 컬럼은 미리 조인됨
** 단일 클러스터 : 하나의 테이블에서 특정 컬럼을 클러스터 키로 생성하여 액세스의 효율성을 높임(동일한 값을 같은 장소에 저장)
\\

* 클러스터의 종류
\\
** 인덱스 클러스터 : 인덱스를 경유하여 클러스터를 찾아감
** 해쉬 클러스터 : 해쉬 함수를 이용하여 클러스터를 찾아감
\\
* 클러스터링 팩터란 : 액세스하고자 하는 데이터가 모여진 정도를 의미

h3. 1.3.2 단일 테이블 클러스터링
* 클러스터에 하나의 테이블만을 생성시킴
* 같은 클러스터 컬럼 값을 가진 로우는 같은 장소에 저장되므로 넓은 범위의 데이터를 동시에 액세스하고자 할 때 주로 활용


!Cluster.JPG!

* 일반 테이블과 Cluster 비교
* 일반 테이블과 달리 클러스터 인덱스는 클러스터 키 컬럼 값마다 단 하나씩만 존재한다.
* 클러스터 스캔 방식
\\
** 클러스터 인덱스에 있는 클러스터ID 정보를 통해 해당 클러스터를 찾는 작업
** 클러스터 컬럼의 조건을 '='이 아닌 'Between' , 'Like' 등을 사용할 경우 인덱스의 처리범위가 끝날 때까지 클러스터 스캔을 반복함
\\
* 클러스터 특징
\\
** 클러스터에 동일한 클러스터 키 값이 모두 표시되지만 물리적으로는 단 한번만 저장됨
** 각각의 로우는 클러스터 ID를 가지고 있어 블록헤더에는 클러스터 키 ID와 클러스터 값을 가지고 있음
** 클러스터 값이 수정될 경우 정해진 위치에 저장되어야 하는 클러스터의 특성상 다른 위치로 이동할 수 밖에 없음
** ROWID의 변경이 발생하므로 일반 인덱스에 문제를 일으킴
** ROWID는 그대로 있고 ROW Migration이 발생함

h3. 1.3.3 다중 클러스터링
* 다중 클러스터링 이란 ?
\\
** 단위 클러스터에 두 개 이상의 테이블을 함께 저장하는 것
** 같은 클러스터 키 컬럼 값을 가진 각 테이블의 로우는 정해진 장소에 같이 저장되므로 테이블 조인 속도를 향상 시키고자 할 때 주로 사용
** 각 로우에는 클러스터 키 ID를 가지고 있으며, 블록헤더에 클러스터 정보를 가지고 있으므로, 단위 클러스터에는 동일한 값인 클러스터 키 값을 가질 필요가 없으며 클러스터 키 값은 실제로 저장되지 않음

{code:sql}
SELECT *
FROM EMP E, DEPT D
WHERE E.DEPTONO = D.DEPTNO
AND D.DEPTNO = '111';
---------------------------------------------------------
Execution Plan
SELECT STATEMENT
NESTED LOOPS
TABLE ACCESS (CLUSTER) OF DEPT
INDEX (UNIQUE SCAN) OF 'DEPT_CLUSTER_IDX' (CLUSTER)
TABLE ACCESS (CLUSTER) OF EMP

{code}

* 클러스터로 묶인 테이블끼리 조인을 수행하는 경우 성능 향상
* 클러스터 컬럼이 수정되면 데이터 값이 수정됨으로 추가적인 클러스터 체인 블록이 발생하므로 클러스터링 효율이 감소

h3. 1.3.4 클러스터링 테이블의 비용
* 클러스터링의 역할
\\
** 클러스터링의 부하를 감수할 수 있는 상황이거나 클러스터링의 도입만이 유일한 대안일 경우만 사용
\\
* 클러스터링으로 인한 부하
\\
** 클러스터링은 단지 조회의 효율만 높여줄 뿐이며 DML시 부하 발생

(가) 입력 시 부하
** 정해진 위치를 찾아서 저장하므로 일반 테이블에 비해 추가적인 부하가 발생
** 값에 따라 저장 위치가 다르므로 프리리스트를 요구하는 횟수가 증가\\

(나) 수정 시 부하
** 클러스터 키를 수정하는 부하
\\
**# ROW MIGRATION 발생으로 인한 부하 발생
**# 클러스터 체인으로 인한 클러스터링 팩터가 나빠짐
\\
** 클러스터 키 이외의 컬럼을 수정하는 부하
**# 일반 테이블과 동일\\

(다) 삭제 시 부하
** 추가적인 부하 없음

h3. 1.3.5 해쉬 클러스터링
* 해쉬 클러스터링의 특징
*# SIZE, HASHKEYS, HASH IS 파라미터를 변경할 수 없음
*# = 로만 액세스 가능
*# 클러스터가 생성되면서 저장공간이 미리 할당
*# 지정된 클러스터보다 많은 로우가 들어오면 오버플로우 영역에 저장
*# 컬럼 값의 분포가 고르지 않으면 해쉬 Collision 발생
*# 인덱스를 경유하지 않고 액세스하므로 인덱스 보다 효율적인 액세스를 할 수 있음

* 해쉬 클러스터링의 활용 범위
*# 각종 코드를 관리하는 테이블, 우편 번호, 시스템 사용자 정보를 관리하는데 활용
*# 해쉬 클러스터에 저장시키는 개념의 좀 더 발전한 형태가 해쉬 파티션이므로, 해쉬 파티션을 적용하는 것이 옳음

* 해쉬 클러스터링의 정의 -> 해쉬 클러스터의 적용을 결정한 경우
*# 클러스터 명칭과 클러스터 키를 정의
*# Hashkeys : 해쉬 키 값의 개수 -> 지정한 값 보다 큰 소수로 할당
*# HashIs : 해쉬 함수를 정의할 수 있음 -> 키 분포를 고려해야 함
*# Size : 같은 해쉬 값을 가지는 로우를 위해 확보할 클러스터의 크기를 의미 -> 계산 예제는 57Page 참조

* 단일 테이블 해쉬 클러스터
** 개념은 인덱스 클러스터에서 설명한 것과 유사함