그렇다면 클러스터드 인덱스(Sparse Index)와 논클러스터드 인덱스(Dense Index)를 어떤 기준으로 선정해야 할까? 아마도 MS나 Sybase의 DBMS를 만지고 있는 사람이라면 이런 고민 한 번쯤은 해봤을 것이다. 보통은 이렇다.
- 범위검색에 많이 사용된다면 클러스터드 인덱스를 사용
- 포인트쿼리(1건 검색)에 많이 사용되거나 몇 건 안되는 컬럼(들)에 논클러스터드 인덱스 사용
회원번호, 가입일..... 과 같은 테이블이라면 뭐 대충 날짜에 생성해 넣는다. 대충 맞기는 하다. 하지만 범위검색 조건으로 서로 다른 컬럼이 생성된다면 어떤 컬럼을 클러스터드 인덱스로 잡을 것인가? 애매모호하다. 대부분 이런 경우다. 주문일, 결제일, 배송완료일 중 어느 컬럼에 클러스터드 인덱스를 잡을 것인가??
주문테이블(주문번호, 회원번호, 주문일, 결제일, 배송완료일...)
물론 이전에 설계가 잘 되었는지 살펴보아야 한다. 많은 경우 설계상으로 해결할 수도 있다. 뭐.. 대충 다음과 같은 따위로 해결 할 수 있다. 바로 주문상태테이블의 상태변경일에 클러스터드 인덱스 잡으면 해결된다.
주문테이블(주문번호, 회원번호)
주문상태테이블(주문번호, 상태코드, 상태변경일) //상태코드: 1(주문), 2(결제), 3(배송완료)
뭐..이렇게 해결할 수도 있지만 어쨌든 통합을 하면 유연해지지만 데이터양이 늘어날 수도 있고, 개체집합의 개념의 범위가 늘어남에 따른 문제(개념의 범위가 조낸 넓으면 관리상의 문제와 데이터 품질에 문제가 생길 수 있다.)가 발생할 수도 있다. 어쨌든 주문일, 결제일, 배송완료일 중 어느 컬럼에 클러스터드 인덱스를 잡을 것인가??라는 문제는 여전히 애매모호하다. 애매모호한 이유가 뭘까? 2가지다.