본문 바로가기
IT/MSSQL

[MSSQL] 인덱스(index) 생성, 삭제, 조회, 최적화

by 베베야 2021. 3. 16.
728x90

INDEX란 데이터를 빠르게 조회할 수 있도록 하는 역할을 합니다. 쉽게 설명하면 책의 목차 같은 기능이라고 생각하면 되는데요. 만약 인덱스가 설정되어 있지 않다면 테이블의 모든 영역을 스캔하게 되고 속도가 효율이 떨어지게 됩니다.
오늘은 데이터베이스 성능 향상을 도와주는 MSSQL 인덱스 생성, 삭제, 조회, 최적화 방법에 대해서 알아보겠습니다.

 

 

인덱스 종류

1. 클러스터 인덱스(Cluster index)
테이블당 한개만 생성이 가능하며 기본키(Primary key)를 생성하면 자동으로 생성됩니다.
테이블은 기본키로 설정된 필드를 중심으로 정렬되어 테이블에 저장되어집니다.

2. 넌 클러스트 인덱스(Noncluster index)
테이블에 여러개를 생성할 수 있습니다. 
클러스터 인덱스보다 효율은 조금 떨어지지만 인덱스가 있는 것과 없는 것은 많은 차이가 있기 때문에 필요시 생성하면 되겠습니다.

 

인덱스 생성,삭제,조회

1. index 생성

Create Cluster/Noncluster index INDEX [인덱스명] ON [테이블명](칼럼명)

Create Cluster index INDEX BEBE_TEST ON bebeya(name)



2. index 삭제

DROP INDEX [테이블명. 인덱스명]

DROP INDEX [bebeya.BEBE_TEST]



3. index 조회

SH_HELPINDEX '테이블명'

SP_HELPINDEX 'bebeya'

 

 

인덱스 최적화

1. SELECT 쿼리만 하는 테이블에서 성능이 가장 좋습니다. INSERT, UPDATE, DELETE 등의 작업은 인덱스를 새로 갱신하는 작업을 하기 때문에 성능이 저하됩니다.

2. 인덱스 칼럼에는 NULL 값을 넣지 않습니다. 추가적으로 NULL 값으로 인덱스 검색 시 (IS NULL) 인덱스가 존재해도 인덱스를 타지 않습니다.

3. 다중(복합)칼럼 인덱스를 사용하는 경우에는 많이 사용하는 컬럼 순서대로 생성합니다.

4. WHERE 조건에서 조인(JOIN)하는 컬럼 기준으로 인덱스를 생성해주는 게 좋습니다. 
그리고 조건문에서 왼쪽의 조건 칼럼이 인덱스가 없다면 오른쪽 조건 칼럼에 인덱스가 있어도 인덱스를 타지 않습니다.

5. like 문 사용 시 '%문자열%'로 사용하면 인덱스를 타지 않으니 '문자열%'로 사용해야 합니다.

6. 부정 연산자를 사용하는 경우 인덱스를 타지 않습니다.(not int, not Exists, <>,!=)

7. OR 구문으로 다른 칼럼과 조회할 경우 테이블 풀 스캔을 진행하기 때문에 인덱스가 소용없습니다.

이상으로 인덱스(index) 생성, 삭제, 조회 방법과 최적화를 하여 데이터베이스 속도를 향상하는 방법에 대해서 알아보았습니다.

반응형
그리드형

댓글