본문 바로가기
Programming/MSSQL

MSSQL 인덱스 생성 CREATE INDEX (CLUSTRED, NONCLUSTRED, INCLUDED, FILTERED INDEX)

by 제타 2018. 4. 25.
반응형

MSSQL은 테이블을 만들면서 인덱스를 만들 수 있다

예를 들어 PRIMARY KEY나 UNIQUE 제약을 지정하면 해당 컬럼에 인덱스가 자동으로 만들어진다.

예를 들어 PRIMARY KEY나 PRIMARY KEY CLUSTERED로 설정하면 고유한 클러스터형 인덱스를 만들 수 있고 UNIQUE CLUSTERED로 설정하면 고유한 클러스터형 인덱스를 만들 수 있다. 그냥 UNIQUE 로 설정하면 고유한 비클러스터형 인덱스가 만들어진다.


하지만 이렇게 말고 테이블을 생성 하고 CREATE INDEX 문으로 인덱스를 만들어보자


다음은 CLUSTRED 인덱스를 만드는 쿼리문이다.

1. 단일 열에 클러스터드 인덱스 만들기

CREATE CLUSTRED INDEX CL_COL1

ON TABLE_NM(COL1)

GO


2. 복합 열에 클러스터드 인덱스 만들기

CREATE CLUSTRED INDEX CL_COL1_COL2

ON TABLE_NM(COL1, COL2)

GO


3. 고유한 클러스터형 인덱스 만들기

CREATE UNIQUE CLUSTRED INDEX UCL_COL1

ON TABLE_NM(COL1)

GO



다음은 NONCLUSTRED 인덱스를 만드는 쿼리문이다.

1. 단일 열에 NON클러스터드 인덱스 만들기

CREATE NONCLUSTRED INDEX NCL_COL1

ON TABLE_NM(COL1)

GO

2. 복합 열에 NON클러스터드 인덱스 만들기

CREATE NONCLUSTRED INDEX NCL_COL1_COL2

ON TABLE_NM(COL1, COL2)

GO

3. 고유한 NON클러스터드 인덱스 만들기

CREATE UNIQUE NONCLUSTRED INDEX UCL_COL1

ON TABLE_NM(COL1)

GO


그런데 위에서 NONCOLUSTRED라는 단어를 생략할 수 있다. 하지만 헷갈리지 않도록 쓰도록 하자.



다음은 포함된 인덱스(Included index)를 만드는 쿼리문이다.

CRAETE NONCLUSTRED INDEX NCL_COL1

ON TABLE_NM(COL1)

INCLUDE(COL2, COL3)

GO

이렇게 INCLUDE 절을 사용하면 NON클러스터드 인덱스 리프 페이지에 인덱스 키 컬럼이 아닌 다른 컬럼을 지정할 수 있다. 리프 페이지에 인덱스 키가 아닌 다른 컬럼을 저장하는 이유는 쿼리문이 찾는 컬럼을 인덱스에 포함해서 RID Lookup이나 Key Lookup으로 인한 성능 저하를 막을 수 있다.



다음은 필터된 인덱스(Filtered index)를 만드는 쿼리문이다.

CREATE NONCLUSTRED INDEX NCL_COL1

ON TABLE_NM(COL1)

WHERE COL2 IS NOT NULL

GO

이렇게 WHERE 절 조건을 만족하는 데이터에 대해서만 인덱스를 만들 수 있다. 이는 인덱스를 만드는 시간도 줄어들고 크기가 작아서 인덱스를 들여다보는 시간도 줄어드니 쿼리문 수행 성능도 높일 수 있다. 



이 외에도 컬럼스토어 인덱스도 있는데 전 글을 참조하길 바란다.

인덱스를 잘 써야 쿼리 성능이 올라가며 인덱스를 아무리 많이 만들어놓아도 수행계획을 제대로 보지 못하고 쿼리를 짜면 인덱스가 무용지물이 된다.

반응형