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

  • 인덱스의 단점

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


  • DBMS에서의 클러스터란 테이블이나 인덱스처럼 저장공간을 가지고 있는 하나의 오브젝트
  • 클러스터는 테이블의 상위 개념(EX : 테이블은 인덱스의 상위 개념임)
  • 클러스터로 생성된 오브젝트 내에 테이블이 생성됨
  • 테이블이 없는 클러스터는 어떤 데이터도 입력할 수 없음
  • 다중 클러스터와 단일 클러스터로 구분됨

    • 다중 클러스터 : JOIN에 필요한 컬럼을 클러스터 키로 생성, 같은 클러스터내의 컬럼은 미리 조인됨
    • 단일 클러스터 : 하나의 테이블에서 특정 컬럼을 클러스터 키로 생성하여 액세스의 효율성을 높임(동일한 값을 같은 장소에 저장)

  • 클러스터의 종류

    • 인덱스 클러스터 : 인덱스를 경유하여 클러스터를 찾아감
    • 해쉬 클러스터 : 해쉬 함수를 이용하여 클러스터를 찾아감

  • 클러스터링 팩터란 : 액세스하고자 하는 데이터가 모여진 정도를 의미

1.3.2 단일 테이블 클러스터링

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

  • 일반 테이블과 Cluster 비교
  • 일반 테이블과 달리 클러스터 인덱스는 클러스터 키 컬럼 값마다 단 하나씩만 존재한다.
  • 클러스터 스캔 방식

    • 클러스터 인덱스에 있는 클러스터ID 정보를 통해 해당 클러스터를 찾는 작업
    • 클러스터 컬럼의 조건을 '='이 아닌 'Between' , 'Like' 등을 사용할 경우 인덱스의 처리범위가 끝날 때까지 클러스터 스캔을 반복함

  • 클러스터 특징

    • 클러스터에 동일한 클러스터 키 값이 모두 표시되지만 물리적으로는 단 한번만 저장됨
    • 각각의 로우는 클러스터 ID를 가지고 있어 블록헤더에는 클러스터 키 ID와 클러스터 값을 가지고 있음
    • 클러스터 값이 수정될 경우 정해진 위치에 저장되어야 하는 클러스터의 특성상 다른 위치로 이동할 수 밖에 없음
    • ROWID의 변경이 발생하므로 일반 인덱스에 문제를 일으킴
    • ROWID는 그대로 있고 ROW Migration이 발생함

1.3.3 다중 클러스터링

  • 다중 클러스터링 이란 ?

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

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


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

1.3.4 클러스터링 테이블의 비용

  • 클러스터링의 역할

    • 클러스터링의 부하를 감수할 수 있는 상황이거나 클러스터링의 도입만이 유일한 대안일 경우만 사용

  • 클러스터링으로 인한 부하

    • 클러스터링은 단지 조회의 효율만 높여줄 뿐이며 DML시 부하 발생

(가) 입력 시 부하

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

(나) 수정 시 부하

    • 클러스터 키를 수정하는 부하

      1. ROW MIGRATION 발생으로 인한 부하 발생
      2. 클러스터 체인으로 인한 클러스터링 팩터가 나빠짐

    • 클러스터 키 이외의 컬럼을 수정하는 부하
      1. 일반 테이블과 동일

(다) 삭제 시 부하

    • 추가적인 부하 없음

1.3.5 해쉬 클러스터링

  • 해쉬 클러스터링의 특징
    1. SIZE, HASHKEYS, HASH IS 파라미터를 변경할 수 없음
    2. = 로만 액세스 가능
    3. 클러스터가 생성되면서 저장공간이 미리 할당
    4. 지정된 클러스터보다 많은 로우가 들어오면 오버플로우 영역에 저장
    5. 컬럼 값의 분포가 고르지 않으면 해쉬 Collision 발생
    6. 인덱스를 경유하지 않고 액세스하므로 인덱스 보다 효율적인 액세스를 할 수 있음
  • 해쉬 클러스터링의 활용 범위
    1. 각종 코드를 관리하는 테이블, 우편 번호, 시스템 사용자 정보를 관리하는데 활용
    2. 해쉬 클러스터에 저장시키는 개념의 좀 더 발전한 형태가 해쉬 파티션이므로, 해쉬 파티션을 적용하는 것이 옳음
  • 해쉬 클러스터링의 정의 -> 해쉬 클러스터의 적용을 결정한 경우
    1. 클러스터 명칭과 클러스터 키를 정의
    2. Hashkeys : 해쉬 키 값의 개수 -> 지정한 값 보다 큰 소수로 할당
    3. HashIs : 해쉬 함수를 정의할 수 있음 -> 키 분포를 고려해야 함
    4. Size : 같은 해쉬 값을 가지는 로우를 위해 확보할 클러스터의 크기를 의미 -> 계산 예제는 57Page 참조
  • 단일 테이블 해쉬 클러스터
    • 개념은 인덱스 클러스터에서 설명한 것과 유사함