반응형
※ msdn을 기준으로한 포스터입니다.
클러스터드 인덱스와 논클러스터드 인덱스는 데이터베이스 성능 최적화에 핵심적인 요소이다.
그 두가지의 개념과 차이점에 대해서 알아보자
인덱스
- 테이블이나 뷰와 연결된 디스크상 구조로, 테이블이나 뷰의 행 검색 속도를 높인다.
- 테이블이나 뷰에 있는 하나 이상의 열로 작성되는 키가 포함된다.
- 이러한 키는 SQL Server가 키 값과 연결된 행을 빠르고 효율적으로 찾을 수 있는(B-Tree)에 저장된다.
테이블 또는 뷰에는 다음과 같은 유형의 인덱스가 포함될 수 있다.
클러스터형 (Clustered index)
- 클러스터형 인덱스는 해당 키 값을 기반으로 테이블이나 뷰의 데이터 행을 정렬하고 저장한다. 이러한 키 값은 인덱스 정의에 포함된 열이다. 데이터 행 자체는 한 가지 순서로만 저장될 수 있으므로 테이블당 클러스터형 인덱스는 하나만 있을 수 있다.
- 테이블의 데이터 행이 정렬된 순서로 저장될 때만 테이블에 클러스터형 인덱스가 포함된다. 테이블에 클러스터형 인덱스가 있는 경우 테이블을 클러스터형 테이블이라고 한다. 테이블에 클러스터형 인덱스가 없는 경우 해당 데이터 행은 힙이라는 순서가 지정되지 않은 구조에 저장된다.
비클러스터형 (Non clustered index)
- 비클러스터형 인덱스는 데이터 행과는 별개의 구조를 갖는다. 비클러스터형 인덱스에는 비클러스터형 인덱스 키 값이 포함되며 각 키 항목에는 해당 키 값이 포함된 데이터 행에 대한 포인터가 있다.
- 비클러스터형 인덱스에서 데이터 행에 대한 인덱스 행의 포인터를 행 로케이터라고 한다. 행 로케이터의 구조는 데이터 페이지가 힙 또는 클러스터형 테이블에 저장되는지 여부에 따라 달라진다. 힙의 경우 행 로케이터는 행에 대한 포인터이다. 클러스터형 테이블의 경우 행 로케이터는 클러스터형 인덱스 키이다.
- 키가 아닌 열을 비클러스터형 인덱스의 리프 수준에 추가하여 기존 인덱스 키 제한을 바이패스하고 완전히 적용된 쿼리를 실행할 수 있다.
공통점
- 고유 인덱스를 만들 수 있다.
- 인덱스가 걸린 열(또는 열 조합)에 중복된 값이 없도록 강제하는 인덱스
- 즉, 동일한 인덱스 키 값을 가진 행이 두 개 이상 존재할 수 없음
예시
클러스터형
B-Tree
┌───────┐
│ 1 │──▶ [Id=1, Name=A, Age=22] (실제 데이터)
├───────┤
│ 2 │──▶ [Id=2, Name=B, Age=25]
├───────┤
│ 3 │──▶ [Id=3, Name=C, Age=20]
└───────┘
Id에 클러스터 인덱스를 건 경우이다.
데이터를 삽입하면 클러스터 테이블에 저장되며 정렬된 상태로 저장된다.
따라서 Id 값을 기준으로 저장이 되기 때문에 테이블당 하나만 존재할 수 있다.
비클러스터형
비클러스터드 인덱스 (idx_name)
B+Tree 구조
┌──────────────┐
│ Name = A │──▶ RowID = 0 (→ [Id=1, Name=A, Age=30])
├──────────────┤
│ Name = B │──▶ RowID = 1 (→ [Id=2, Name=B, Age=25])
├──────────────┤
│ Name = C │──▶ RowID = 2 (→ [Id=3, Name=C, Age=20])
└──────────────┘
┌────────────────────┐
│ Name=A → RowID=0 ────────┐
├────────────────────┤ │
│ Name=B → RowID=1 ──────┐ │
├────────────────────┤ │ │
│ Name=C → RowID=2 ────┐ │ │
└────────────────────┘ │ │ │
▼ ▼ ▼
Users 테이블 (실제 데이터)
┌───────────────────────────────────┐
│ RowID=0 → Id=1, Name=A, Age=30 │
│ RowID=1 → Id=2, Name=B, Age=25 │
│ RowID=2 → Id=3, Name=C, Age=20 │
└───────────────────────────────────┘
왼쪽이 정렬된 키(Name)와 키 값 RowID(행 로케이터)이다.
비클러스터에 관한 키와 키 값을 포인터로 두는 공간이 따로 있고 그 공간이 정렬되어 있다.
이 정렬된 구조에 따라 실제 데이터에 접근하여 데이터를 검색한다.
따라서 실제 데이터 정렬에는 아무런 상관이 없으며 클러스터형과 다르게 여러개 만들 수 있다.
대신 처음부터 정렬되어 있는 상태가 아니다.
그래서 정렬된 포인터를 거쳐 데이터를 찾기에 2번에 걸쳐 데이터를 찾아 클러스터형 보다는 느리다.
요약
- 클러스터형 인덱스는 데이터 자체가 정렬되어 저장된다.
- 비클러스터형 인덱스는 정렬된 행 포인터만 따로 존재하고 데이터는 따로 있다.
- 클러스터가 비클러스터보다 빠르다.
- 클러스터는 1번의 문제로 테이블당 하나만 존재할 수 있다.
- 비클러스터는 여러개 만들 수 있다. 2번의 이유로 인해 여러개 만들면 무거워 진다.
- 클러스터, 비클러스터 둘 다 고유 인덱스를 가질 수 있다.
반응형
'SQL' 카테고리의 다른 글
DBMS 동작 방식 (1) | 2024.11.24 |
---|---|
[SQL] sql 문법 입문 (1) (0) | 2024.10.16 |