본문 바로가기

데이터베이스

Clustered Index

인덱스는 쿼리를 처리하는 속도와 같은 성능과 관계가 있다.  

흔히 책의 색인과 유사하다. 어떤 키워드와 관련한 페이지로 이동을 해야할 때 우린 색인을 찾아본다. 그럼 몇 페이지로 이동하면 해당 키워드와 연관된 내용을 볼 수 있는지 알 수 있다. 만약 색인이 없다면 우린 책을 처음부터 끝까지 넘겨보거나 아무 페이지나 마구 펼쳐가며 찾든 비효율적인 과정을 거칠것이다. 

 

SQL Server에는 두 가지 유형의 인덱스가 있다.

1. 클러스터형 인덱스(Clustered Index) 

2. 비 클러스터형 인덱스(Non Clustered Index)

 

먼저 클러스터형 인덱스를 간단히 살펴보겠다. 

 

클러스터형 인데스는 테이블 내에 있는 데이터의 물리적 저장 순서를 정의한다. 테이블 당 하나의 클러스터 인덱스가 존재한다. 테이블에 저장된 데이터는 이 인덱스에 의해 정렬이 된다.

 

예를 들어 학생테이블이 있다. 이 테이블에는 학번(Stud_id)이라는 컬럼이 존재하고 이 컬럼을 Primary Key로 설정해보겠다. 이렇게 하면 학번에 대해 클러스터 인데스가 자동으로 만들어진다. 

 

 Create Table Student

(

    Stud_id int Primary Key,

    Name nvarchar(10) not null,

    Dept_Cd nvarchar(10) not null,

    Mobile_Num nvarchar(13) not null,

)

 

어떤 테이블에 존재하는 모든 인덱스를 보기 위해 "sp_helpindex"라는 저장 프로시져를 아래와 같이 실행시켜 보겠다. 

간단히 sp_helpindex 뒤에 테이블명을 입력해주면 되겠다. 

 

execute sp_helpindex Student; 

아래 출력 결과를 보면 하나의 인덱스가 보인다. 

 

 

 

클러스터 인덱스는 레코드(행)를 저장할 때 인덱스로 설정된 컬럼(속성) 값의 순서로 테이블에 저장한다. 

 

이제는 순서없이 학생데이터를 삽입해 보겠다. 

Stud_id가 5인 레코드는 Insert의 맨 처음에 보이지만 맨 마지막에 저장될 것이다. Stud_id가 3인 레코드은 4번째 행에 보이지만 테이블에서 3번째 저장될 것이다.

 

insert into Student (Stud_id, Name, Dept_Cd, Mobile_Num)
Values(5, 'Aim', '10235', '050-1234-5678'),
        (2, 'Bim', '10232', '020-1234-5678'),
        (4, 'Cim', '10234', '040-1234-5678'),
        (3, 'Dim', '10233', '030-1234-5678'),
        (1, 'Fim', '10231', '010-1234-5678');

 

조회해 보자 결과는 역시 학번값의 오름차순으로 정렬되어 나오는 것을 알 수 있다.

왜 그럴까? 클러스터 인덱스는 인덱스로 지정된 컬럼을 참고하여 레코드 저장시에 물리적 순서를 지속적으로 관리하기 때문이다. 

Select * from Student;

 

 

 

 

 

 

 

'데이터베이스' 카테고리의 다른 글

Non clustered Index  (0) 2020.06.01
Custom Clustered Index  (0) 2020.05.30
Convert 함수를 이용한 날짜 및 시간 스타일 변환  (0) 2020.05.28
Sql Server RAISERROR 2부  (0) 2020.05.26
SQL Server RAISERROR 1부  (0) 2020.05.25