개발바닥 아방수

[MSSQL] 클러스터 PK 인덱스와 넌 클러스터 PK 인덱스, 넌 클러스터 인덱스 기준 본문

데이터베이스/MS-SQL

[MSSQL] 클러스터 PK 인덱스와 넌 클러스터 PK 인덱스, 넌 클러스터 인덱스 기준

앙큼아기 2022. 11. 23. 10:34

인덱스의 종류


SQL Server 에서는 인덱스의 종류로 크게 Clustered Index 와 Non Clustered Index 를 지원합니다.

Clustered Index 는 해당 키를 기준으로 물리적으로 정렬되어지는,

Non Clustered Index 는 해당 키를 기준으로 논리적으로 정렬되어 지게 됩니다.

 

SQL Server 에 Primary Key 를 생성하는 경우 기본적으로는 Clustered Index 로 생성됩니다.

그러나 Primary Key 를 Non Clustered Index 로 생성한 후 Clustered Index 를 다른 컬럼으로도 생성할 수 있습니다.

 

Clustered Index 는 가장 좋은 성능을 발휘하지만 테이블에서 한개밖에 생성할 수 없기 때문에,

해당 테이블을 조회하는 쿼리 중 가장 많은 조건에 부합하는 컬럼으로 하는게 좋습니다.

( 보통은 Primary Key 를 기준으로 조회를 많이 하기 때문에 Primary Key 를 Clustered Index 로 잡는 경우가 많습니다. )

 

 

 

 

Clustered Index 선택 기준


클러스터 인덱스를 삼는 기준은 다음과 같습니다.

1. Unique 할 것 : 그렇지 않은 경우 4 바이트의 식별자 값이 추가로 부여됩니다.

2. 키 길이가 작을 것 : 그렇지 않은 경우 Non Clustered Index 의 키 길이에 영향을 미치게 됩니다.

3. 정적인 데이터일 것 : 아니면 키 값이 Update 되는 경우 위치 이동이 발생하며 Page Split 이 유발됩니다.

 

그러나 보통 Clustered Index 는 OLTP 보다는 OLAP 성인 경우가 많습니다. 그래서 아래의 조건도 같이 충족해야 합니다.

1. 대량 범위 조건을 가지는지

2. 공통 조건으로 사용하는지

3. 조인 조건으로 사용되는지

 

 

 

 

클러스터 PK 인덱스 VS 넌 클러스터 PK 인덱스


많은 경우에 PK 인덱스는 Clustered Index 가 될 수 있습니다.

위에서 말한 것 처럼 보통은 공통된 쿼리에서 PK를 조건으로 많이 사용하기 때문입니다.

그래서 평범하게 생각하면 Primary Key 는 Clustered Index 이다. 라고 생각할 수 있습니다.

 

그러나 예를 들어 PK 가 고유값 기능만 하고, 조회쿼리에서는 사용빈도가 없다면 어떻게 해야할까요?

PK 는 Non Clustered 로 생성되어야 하고, 조회쿼리에서 공통조건으로 사용하는 다른 컬럼을 Clustered Index 로 생성하는게 더 좋습니다.

 

 

제가 전달하고 싶은 의미는,

Primary Key 는 Clustered Index 이어야 한다 라는 생각을 가지면 안된다는 것 입니다.

데이터의 성격에 따라, 쿼리의 유형에 따라 어떤 컬럼을 Clustered Index 로 설정할 것인지를 결정한 후에,

해당 컬럼이 Primary Key 의 유형이 될 수 있는지 없는지를 파악하는 것이 더 좋습니다.

 

 

 

 

넌 클러스터 인덱스


일반 B-Tree 인덱스 입니다.

클러스터 인덱스의 기준에 포함되지 않은 컬럼 중 조건에 포함되는 컬럼들로 구성하면 됩니다.

 

다만, 클러스터 인덱스가 구성되어 있는 경우에는 클러스터 인덱스의 리프 레벨에서 재구성 됩니다.

이렇기 때문에 클러스터 인덱스의 키 값이 긴 경우에는 넌 클러스터 인덱스의 키 값의 길이도 길어지게 됩니다.

 

 

(참고출처) https://mozi.tistory.com/319

'데이터베이스 > MS-SQL' 카테고리의 다른 글

[MSSQL] 커서 사용법 & 예제  (0) 2023.01.04
[DB] MSSQL 자동증가열(IDENTITY)사용법  (0) 2022.11.23