태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.
밤하늘의 실제별, 나도 가질 수 있다?!

[대용량 Database의 Table] Clustering Factor 에 대한 이해

2007/07/07 13:25

 

[공지]이미지나 링크가 깨졌다면 댓글 부탁드립니다.

여기 내용은 제가 Database를 공부하면서 기존자료를 쓴 것도 있고 제 나름대로 정리한 것도 있습니다. 전문가가 쓴 글이 아니니 그냥 개념이해를 위해서만 참고하시기 바랍니다.
대용량의 Database의 Table을 사용하다 보면 어떤 특정 Entity에 대해 Index를 줄 필요가 있다.
Index를 만드는 것도 중요하지만 Index의 효율성 또는 Table의 각 Row의 배치 방법도 Access속도와 효율성을 위해서도 상당히 중요하다.

한가지 예를 들어보겠다.
책의 앞에 목차나 뒤에 찾아보기등이 있어 쉽게 내가 원하는 내용을 찾아볼 수 있듯이 Database에도 Index가 있으면 원하는 정보를 쉽고 빠르게 찾는데 도움을 줄 수 있다.
C언어 책에서 포인터라는 내용을 찾는데 찾아보기 페이지에서 350페이지에 있다고 명시되어 있는 경우는 한번에 찾아갈 수 있지만 20,50,120,350페이지를 명시되어 있다면 우리는 포인터에 대한 원하는 정보를 찾기 위해 4페이지를 찾아가야 한다. 찾기 쉬운 것은 첫번째 방법이겠다.

이런 이야기를 하는 이유는 바로 이제부터 말할 Clustering Facter이 이러한 내용과 유사하기 때문이다.
Cluster는 무리, 집단을 의미한다. 그래서 Clustering Facter는 모여있는 정도를 뜻한다.

Clustering Factor란?

"내가 원하는 정보를 끌어낼때 그러한 정보가 얼마나 같은 공간(물리적공간, block)에 모여있는지 여부."
이해가 가는가? 다음을 보자~ ^^


Clustering Factor에 대한 자세한 설명


Clustering Factor에 대해서 좀더 자세히 알아보자.
사용자 삽입 이미지

위의 그림은 한 Table에 있는 고객 목록이라고 가정하자. 그리고 한 테이블에 있다 하더라도 물리적으로 5개의 Block으로 나뉘어져 있을 수 있다.  여기서 숫자는 고객의 번호, 글자는 고객 이름이다.

자 그럼 이 고객의 번호을 찾을 수 있는 Index가 아래와 같이 있다고 가정하자.

사용자 삽입 이미지
이 Index도 2개의 Block으로 나뉘어져 있음을 알 수 있다.
여기서 중요하게 봐야할 점은 Index의 고객번호 정렬순서와 고객 Table의 고객번호 정렬순서가 동일하다는 것이다.
그럼 여기서 이 Index의 clustering factor는 다음과 같이 계산된다.
가령 select * from 테이블 명 where 고객번호 between 10 and 100 을 할때이다.

10번 고객을 찾기 위해 고객 Table의 1번 Block 방문  : 1번
20번 고객을 찾기 위해 고객 Table의 1번 Block 방문  : 연속적인 방문이므로 방문수 증가 안함
30번 고객을 찾기 위해 고객 Table의 2번 Block 방문 : 1번
40번 고객을 찾기 위해 고객 Table의 2번 Block 방문 : 연속적인 방문이므로 방문수 증가 안함
50번 고객을 찾기 위해 고객 Table의 3번 Block 방문 : 1번
60번 고객을 찾기 위해 고객 Table의 3번 Block 방문 : 연속적인 방문이므로 방문수 증가 안함
70번 고객을 찾기 위해 고객 Table의 4번 Block 방문 : 1번
80번 고객을 찾기 위해 고객 Table의 4번 Block 방문 : 연속적인 방문이므로 방문수 증가 안함
90번 고객을 찾기 위해 고객 Table의 5번 Block 방문 : 1번
100번 고객을 찾기 위해 고객 Table의 5번 Block 방문 : 연속적인 방문이므로 방문수 증가 안함

위에서 살펴본 것과 같이 Index를 참고해 고객번호순으로 고객명단을 찾을때 고객Table의 Block을 5번 Access한 것을 볼 수 있다. 이 경우 정확하게 Table의 Block수와 Block Access수가 동일하다.

고객명으로 인덱싱된 다음 Index를 보자.

사용자 삽입 이미지

이 Index도 위와 동일한 Process로 고객정보를 읽어오게 된다.
여기서 잘 살펴볼 것은 Index의 고객명의 정렬된 순서와 고객 Table의 정렬된 순서가 일치하지 않는다.

ADAM 고객을 찾기 위해 고객 Table의 2번 Block 방문  : 1번
BILL 고객을 찾기 위해 고객 Table의 5번 Block 방문  : 전과 연속적인 Block이 아니므로 방문수 1번 증가
BOB 고객을 찾기 위해 고객 Table의 4번 Block 방문 : 1번
CHARLES 고객을 찾기 위해 고객 Table의 3번 Block 방문 : 전과 연속적인 Block이 아니므로 방문수 1번 증가
DAVID 고객을 찾기 위해 고객 Table의 4번 Block 방문 : 1번
ED 고객을 찾기 위해 고객 Table의 1번 Block 방문 :  전과 연속적인 Block이 아니므로 방문수 1번 증가
FRANK 고객을 찾기 위해 고객 Table의 2번 Block 방문 : 1번
GRAHAM 고객을 찾기 위해 고객 Table의 3번 Block 방문 : 전과 연속적인 Block이 아니므로 방문수 1번 증가
HOWARD 고객을 찾기 위해 고객 Table의 1번 Block 방문 : 1번
MARY 고객을 찾기 위해 고객 Table의 5번 Block 방문 : 전과 연속적인 Block이 아니므로 방문수 1번 증가

전에 Index와 다르게 Block Accss수가 10번이다. 즉 고객의 수 만큼 Access를 한 것이다.

여기서 Clustering Factor는 전자의 경우는 5이고 후자는 10이다.
Clustering Factor가 작다는 것은 그 만큼 Index를 이용한 Table Access가 적다는 의미이다.
Clustering Factor를 작게 하기 위해서는 설명을 하면서 힌트를 준 바, Index와 Table Entity의 순서가 동일하면 된다. 즉, 최대 Block수만큼만 Accss하면 된다. 하지만 순서가 동일하지 않을 경우 위의 예시의 후자처럼 최악의 경우 Table의 Row수만큼 Access해야한다.


Clustering Factor를 좋게하는 방법

이미 말했지만 Table의 Block을 적게 방문게 하는 것이 좋다. 그렇게 하기 위해 다음과 같은 방법을 주로 사용하게 된다.

  1. Sorting Table
    테이블을 sorting해서 recreate 시키면, random block IO가 많다 하더라도 physical block IO의 횟수는 현저히 줄어든다.
  2. Clustering의 활용
    Random  Access를 현저히 줄여줌.
    • single-table cluster
      인덱스  range가 부담이 되는경우에 사용.
    • multi-table cluster
      1정규화에 의한 분할된 테이블이 항상 조인하는 경우에 물리적인 한 공간에서 2개의 테이블을 같이 뽑아내고 싶은경우에 사용.


 

참고내용

Clustering Factor란 ?  : http://www.okjsp.pe.kr/seq/48419
Clustering for Indexes : http://www.databasejournal.com/features/oracle/article.php/3429281
The significance of the Index Clustering Factor : http://www.dizwell.com/prod/node/22

글쓴이 : 지돌스타 (http://blog.jidolstar.com/153 )

크리에이티브 커먼즈 라이선스
Creative Commons License

개발/Database , , , , ,

Trackback 주소: http://blog.jidolstar.com/trackback/153