이 글에서는 SQL Server에서 인덱스를 생성하고, 이름을 변경하며, 삭제하는 방법을 단계별로 자세히 알아봅니다.
SQL Server의 인덱스란?
인덱스(Index)는 데이터베이스에서 레코드를 더 빠르게 조회하기 위해 사용되는 핵심 기능입니다. 마치 책의 목차처럼, 인덱스는 인덱스가 적용된 열에 있는 각 값을 가리켜 원하는 데이터의 위치를 신속하게 찾을 수 있도록 도와줍니다.
인덱스 생성
기본 구문
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX ten_chimuc
ON ten_bang ( cot1 [ ASC | DESC ], ... cot_n [ ASC | DESC ] )
[ INCLUDE ( cot1, ... cot_n ) ]
[ WHERE dieu_kien ]
[ WITH (
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB = { ON | OFF }
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| STATISTICS_INCREMENTAL = { ON | OFF }
| DROP_EXISTING = { ON | OFF }
| ONLINE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| MAXDOP = so_toida
| DATA_COMPRESSION = { NONE | PAGE | ROW }
) ]
[ ON PARTITIONS ( { so | khoang } ) ]
[ ON scheme_phandoan ( cot )
| ON nhomtaptin | ON nhomtaptin_macdinh ]
[ FILESTREAM_ON { nhomtaptin | scheme_phandoan } ];
주요 매개변수 설명
- UNIQUE: 선택 사항으로, 인덱스 열의 값 조합이 반드시 고유해야 함을 지정합니다.
- CLUSTERED: 선택 사항으로, 테이블 내 행의 물리적 저장 순서를 결정하는 논리적 순서를 지정합니다. 즉, 인덱스 필드를 기준으로 테이블의 레코드가 정렬됩니다.
- NONCLUSTERED: 선택 사항으로, 테이블 내 행의 물리적 저장 순서에는 영향을 주지 않는 논리적 순서를 지정합니다.
- ten_chimuc: 생성하려는 인덱스의 이름입니다.
- ten_bang: 인덱스가 생성될 테이블 또는 뷰(View)의 이름입니다.
- cot1, ... cot_n: 인덱스를 구성하는 열입니다.
- ASC | DESC: 해당 열 값의 정렬 순서(오름차순 또는 내림차순)를 지정합니다.
- INCLUDE (cot1, ... cot_n): 선택 사항으로, 비클러스터형 인덱스의 리프(Leaf) 수준에 추가할 보조 열을 지정합니다.
- WHERE dieu_kien: 선택 사항으로, 어떤 행을 인덱스에 포함할지 결정하는 필터 조건입니다.
- ON scheme_phandoan (cot): 선택 사항으로, 파티션이 매핑될 파일 그룹(filegroup)을 결정하는 파티션 구성표를 지정합니다.
- ON nhomtaptin: 선택 사항으로, 지정된 파일 그룹 위에 인덱스를 생성합니다.
- ON nhomtaptin_macdinh: 선택 사항으로, 기본 파일 그룹을 지정합니다.
- FILESTREAM_ON {nhomtaptin | scheme_phandoan}: 선택 사항으로, 클러스터형 인덱스의 FILESTREAM 데이터 위치를 지정합니다.
SQL Server 인덱스 생성 예제
다음은 단일 필드로 인덱스를 생성하는 기본적인 예제입니다.
CREATE INDEX danhba_chimuc ON danhba (ho);
이 예제는 danhba 테이블에 ho라는 필드 하나로 구성된 danhba_chimuc라는 이름의 인덱스를 생성합니다.
두 개 이상의 필드로 복합 인덱스를 만들 수도 있습니다.
CREATE INDEX danhba_chimuc ON danhba (ho, ten);
이 예제는 danhba 테이블에 ho와 ten 두 개의 필드로 구성된 danhba_chimuc 인덱스를 생성합니다. 각 항목에 대해 ASC 또는 DESC를 명시하지 않으면, 인덱스는 기본값인 오름차순으로 생성됩니다.
내림차순으로 정렬하고 싶다면 다음과 같이 작성합니다.
CREATE INDEX danhba_chimuc ON danhba (ho DESC, ten DESC);
위 CREATE INDEX 문은 성과 이름 모두 내림차순으로 정렬된 danhba_chimuc 인덱스를 생성합니다.
고유 인덱스(Unique Index) 예제
CREATE UNIQUE INDEX danhba_chimucduynhat ON danhba (ho, ten);
이 예제는 danhba 테이블에 성과 이름 두 필드로 구성된 danhba_chimucduynhat이라는 고유 인덱스를 생성하며, 이 두 필드의 조합이 중복되지 않음을 보장합니다.
클러스터형 고유 인덱스를 생성하면, 테이블 내 행의 물리적 순서가 인덱스의 논리적 순서에 따라 결정됩니다.
CREATE UNIQUE CLUSTERED INDEX danhba_chimucduynhat ON danhba (ho, ten);
이렇게 생성된 인덱스는 성과 이름 두 필드로 구성되며, 동시에 테이블 내 행들의 정렬 순서도 이 인덱스 기준으로 재배열됩니다.
SQL Server에서 인덱스 이름 변경
구문
sp_rename 'tenbang.ten_chi_muc_cu', 'ten_chimuc_moi', 'INDEX';
- ten_bang: 인덱스가 생성된 테이블의 이름입니다.
- ten_chi_muc_cu: 이름을 변경하려는 기존 인덱스의 이름입니다.
- ten_chimuc_moi: 인덱스에 부여할 새 이름입니다.
예제
sp_rename 'danhba.danhba_chimuc', 'danhba_chimuc_ten', 'INDEX';
이 예제는 danhba 테이블의 인덱스 이름을 danhba_chimuc에서 danhba_chimuc_ten으로 변경합니다.
SQL Server에서 인덱스 삭제
구문
DROP INDEX tenbang.ten_chimuc;
- ten_bang: 인덱스가 생성된 테이블의 이름입니다.
- ten_chimuc: 삭제하려는 인덱스의 이름입니다.
예제
DROP INDEX danhba.danhba_chimuc;
이 예제는 danhba 테이블에서 danhba_chimuc라는 이름의 인덱스를 삭제합니다.
지금까지 SQL Server에서 인덱스를 생성하고 관리하는 전 과정을 살펴보았습니다. 인덱스를 적절히 활용하면 쿼리 성능을 크게 향상시킬 수 있으므로, 데이터 조회가 빈번한 열에 인덱스를 전략적으로 적용해 보시기 바랍니다.