1. index란?
간단한 비유로 책 뒤에 위치하는 ‘찾아보기’를 들 수 있습니다. 만약 찾아보기가 없다면 한 단어를 찾을 때 책의 첫 장부터 훑어야 할 것입니다.
찾아보기가 있다면 한번에 찾아 갈 수 있습니다.
이러한 인덱스는 자주 사용되는 필드 값으로 만들어진 원본 테이블의 사본이라고 생각할 수 있습니다.
이러한 인덱스는 사용자가 직접 접근할 수는 없으며, 검색과 질의에 대한 처리에서만 사용됩니다.
2. index생성시 장단점
index를 사용하는 가장 큰 이유이자 장점은 검색속도의 향상입니다. 하지만 인덱스를 위한 추가 비용이 필요하고, INSERT, UPDATE, DELETE가 자주 발생한다면 오히려 성능이 많이 떨어집니다.
인덱스가 설정된 필드 값을 포함한 데이터의 삽입, 수정, 삭제 작업이 원본 테이블에서 이루어질 경우, 인덱스도 함께 수정되어야 하기 때문입니다.
그러므로 인덱스는 수정보다는 검색이 자주 사용되는 테이블에서 사용하는 것이 좋습니다.
3. 종류
3.1. Clustred Index
- 테이블 당 한 개만 생성이 가능한 index 입니다.(pk처럼)
- 행 데이터를 index로 지정한 열에 맞춰서 자동 정렬합니다.(인덱스를 생성할 때 데이터 페이지 전체를 다시 정렬합니다.)
- 영어 사전과 같이 순서대로 정렬되어 있어 인덱스 자체가 책의 내용과 같습니다.(테이블 데이터 자체가 리프페이지)
- 클러스터 인덱스는 데이터를 가르키는 포인터가 아닌(not record) 데이터를 저장한 블록의 포인터를 저장합니다.
클러스터형 인덱스를 구성하면 행데이터를 해당 열로 정렬한 후(indexTest1~15)에 root page를 만들게 됩니다.
이때 root page는 해당하는 블록의 포인터를 가르킵니다.
3.2. Nonclustered Index
- 테이블 당 여러 개를 생성할 수 있습니다.(데이터 페이지는 그냥 둔 상태로 별도의 페이지에 인덱스를 구성합니다.)
- 레코드 원본은 정렬되지 않고, 인덱스 페이지만 정렬됩니다.
- 찾아보기가 있는 책과 같은 인덱스 입니다.
- 데이터를 가르키는 포인터(Row ID)를 저장합니다.
비클러스터형 인덱스는 데이터 페이지를 건들지 않고, 별도의 장소에 인덱스 페이지를 생성합니다.
데이터의 위치 포인트는 페이지 번호 + 오프셋으로 기록되어 데이터 위치를 가리킵니다.
원본 데이터(data page)가 정렬되지 않은 모습을 볼 수 있고, index 15를 예로들면, 101번 리프노드의 두번째 오프셋에 데이터가 있다고 기록하게 됩니다.
3.3. 비교
클러스터 인덱스는 비클러스터 인덱스에 비해 검색 속도는 빠르지만, 입력/수정/삭제는 느립니다.
클러스터 인덱스는 성능이 좋지만 테이블에 한 개만 생성할 수 있으므로, 어느 열에 클러스터형 인덱스를 생성하느냐가 중요합니다.
통계같은 대용량의 데이터에 클러스터형 인덱스를 생성하는 것은 심각한 시스템 부하를 줄 수 있습니다.
4. index 생성
- 인덱스는 열(column) 단위로 생성됩니다.
- 1:1 혹은 N:1관계로 열과 인덱스를 생성할 수 있습니다.
- 테이블 생성시 하나의 열에 Primary key를 지정하면 자동으로 클러스터형 인덱스가 생성됩니다.
- PK를 지정하는 열에 강제로 비클러스터형 인덱스를 지정할 순 없습니다.
- 인덱스가 자동 생성되기 위한 열의 제약 조건은 pk 또는 unique 뿐입니다.
CREATE INDEX 인덱스이름
ON 테이블이름 (필드이름1, 필드이름2, ...)
위의 예시처럼 쉼표를 사용하여 여러 필드를 가지는 인덱스를 생성할 수 있습니다.
5. 결론
클러스터 인덱스는 데이터 위치를 바로 알기 때문에 그 데이터로 바로 접근할 수 있고, 비클러스터 인덱스는 페이지를 한번 거쳐서 데이터에 접근합니다.
댓글남기기