cluster index vs nonclustered index


안녕하세요.
고코더 입니다.


면접 질문으로 가장 인기가 많은 질문입니다. "클러스터드 인덱스와 넌 클러스터드 인덱스의 차이점을 설명하시오"
항상 받는 질문이지만 또 시간이 지나면 까먹고는 해서 한번 다시 복습할겸 정리합니다. 개념 자체는 어렵지는 않지만 이상하게 까먹는 내용입니다. 우선 표로 간단하게 차이점을 정리했습니다. 표를 한번 흝어보고 계속 읽어보시기 바랍니다.

클러스터드 인덱스
넌클러스터드 인덱스
배열
행을 물리적으로 재배열 한다.
행을 물리적으로 배열 하지 않는다.
크기
인덱스 페이지 용량이 작다
인덱스페이지 용량이 크다.
선택도
30% 이내 사용 권장
3% 이내 사용 권장
테이블당
사용 갯수
1개
249개



차이점 설명


클러스터드 인덱스는 데이터를 재배열 한다.

간단하게 차이점을 설명한다면 클러스터드는 입력된 데이터를 인덱스 기준으로 저장한다는 것입니다. 
만약에 이런 데이터가 있다고 해봅시다. 게임이라고 하고 아이템 데이터를 데이터베이스에 저장합니다. 그리고 이와 같은 컬럼으로 저장을 합니다. 그리고 클러스터드를 게임아이디 기준으로 잡습니다.

아이템에서 가장 중요한건 소유가 가장 중요합니다. 아래처럼 테이블 생성하고 게임 아이디를 클러스터 인덱스로 잡았습니다. 그럼 아이템 데이터가 들어올때마다 게임 아이디 순으로 재배열 합니다. 이렇게 되면 게임속에서 해당 아이디가 가지고 있는 아이템 데이터를 조회 할때 유리 합니다.

1
2
3
4
5
6
7
CREATE TABLE 아이템테이블 (
  게임아이디 CHAR(8NOT NULL,
  아이템이름 VARCHAR(1NOT NULL,  
  능력치 int NULL,
  가격 int NULL
  PRIMARY KEY (게임아이디)
cs

이 덕분에 데이터를 이미 정렬하여 사용하기 때문에 리프레벨(Leaf Level) 인덱스 테이블이 필요하지 않게 됩니다. 인덱스 테이블이 따로 필요하지 않기에 용량이 필요하지 않습니다.

넌클러스터드 인덱스는 인덱스 테이블을 생성합니다.

넌클러스터드 인덱스는 별도의 공간에 테이블을 생성하여 데이터를 정렬 해놓습니다. 그래서 리프레벨(Leaf Level) 인덱스 테이블이 필요합니다. 인덱스로 저장한 칼럼을 기준으로 인덱스 테이블에 저장하기 때문에 데이터베이스 용량을 차지 하게 됩니다.

새롭게 게임을 업데이트 하면서 기획자가 아이템 획득장소 기준으로 어떤 아이템들을 획득했는지 보여주려고 합니다. 이럴때 특장 캐릭터가 특정 위치에 갔을때 누가 어떤 아이템을 획득했는지 조회 할려면 '획득장소' 라는 칼럼을 생성하고 논클러스터를 생성합니다.

1
ALTER TABLE 아이템테이블 ADD CONSTRAINT CLUSTER_TABLE_ID UNIQUE(획득장소) 
cs

이렇게 되면 획득장소 기준으로 데이터가 인덱스 테이블에 따로 저장되고 장소 기준으로 조회시에 빠른 속도를 유지할 수 있습니다



다시 한번 복습 해봅시다.


클러스터형 인덱스
- 인덱스를 생성할 때는 데이터 페이지 전체를 다시 정렬한다.
- 대용량의 데이터를 강제로 다시 클러스터 인덱스를 생성하는 건 조심
- 인덱스 자체가 데이터 페이지이다. 인덱스 자체에 데이터가 포함
- 비클러스형 인덱스 보다 검색 속도는 더 빠르다. 하지만 데이터의 입력/수정/삭제는 느리다.
- 테이블에 한 개만 생성할 수 있다.


넌 클러스터형 인덱스
- 별도의 페이지에 인덱스를 구성한다.
- 검색 속도는 느리지만, 데이터의 입력,수정,삭제가 더 빠르다.
- 남용할 경우에는 시스템 성능을 떨어뜨리는 결과를 가져온다.


마무리


나만의 스토리를 만들어 외워보세요.


댓글을 달아 주세요