인덱스 만들기(데이터베이스 엔진)
이 항목에서는 주요 인덱스 생성 태스크를 설명하고 인덱스를 만들기 전에 고려해야 할 구현 및 성능 지침을 제공합니다.
인덱스 생성 태스크
권장되는 인덱스 생성 전략은 다음과 같은 태스크로 이루어집니다.
인덱스를 디자인합니다.
인덱스 디자인은 중요한 태스크입니다. 여기에는 사용할 열 결정, 클러스터형이나 비클러스터형과 같은 인덱스 유형 선택, 적절한 인덱스 옵션 선택, 파일 그룹이나 파티션 구성표 배치 결정 등의 작업이 포함됩니다. 자세한 내용은 인덱스 디자인을 참조하십시오.
최상의 생성 방법을 결정합니다. 인덱스는 다음과 같은 방법으로 생성됩니다.
CREATE TABLE이나 ALTER TABLE을 사용하여 열에 PRIMARY KEY 또는 UNIQUE 제약 조건 정의
PRIMARY KEY 또는 UNIQUE 제약 조건의 고유성 요구 사항에 따라 SQL Server 데이터베이스 엔진에서 자동으로 고유 인덱스가 생성됩니다. PRIMARY KEY 제약 조건을 정의하면 테이블에 클러스터형 인덱스가 이미 있거나 사용자가 고유 비클러스터형 인덱스를 지정하는 경우를 제외하고 기본적으로 고유 클러스터형 인덱스가 생성됩니다. UNIQUE 제약 조건을 정의하면 사용자가 고유 클러스터형 인덱스를 명시적으로 지정하고 테이블에 클러스터형 인덱스가 없는 경우를 제외하고 기본적으로 고유 비클러스터형 인덱스가 생성됩니다.
인덱스 옵션 및 인덱스 위치, 파일 그룹 또는 파티션 구성표도 지정할 수 있습니다.
PRIMARY KEY 또는 UNIQUE 제약 조건의 일부로 생성되는 인덱스에는 제약 조건 이름과 동일한 이름이 자동으로 지정됩니다. 자세한 내용은 PRIMARY KEY 제약 조건 및 UNIQUE 제약 조건을 참조하십시오.
SQL Server Management Studio 개체 탐색기의 새 인덱스 대화 상자나 CREATE INDEX 문을 사용하여 제약 조건으로부터 독립적인 인덱스 생성
인덱스를 적용할 인덱스의 이름, 테이블 및 열을 지정해야 합니다. 인덱스 옵션 및 인덱스 위치, 파일 그룹 또는 파티션 구성표도 지정할 수 있습니다. 고유 옵션이나 클러스터형 옵션을 지정하지 않으면 기본적으로 비고유 비클러스터형 인덱스가 생성됩니다. 필터링된 인덱스를 만들려면 선택 사항인 WHERE 절을 사용합니다. 자세한 내용은 필터링된 인덱스 디자인 지침을 참조하십시오.
인덱스를 만듭니다.
인덱스를 만들 테이블이 빈 테이블인지 아니면 데이터가 있는 테이블인지 고려해야 합니다. 빈 테이블에 인덱스를 만들 경우 인덱스가 생성되는 그 당시에는 성능에 영향이 없지만 테이블에 데이터를 추가할 때 성능에 영향이 있습니다.
대형 테이블에 인덱스를 만들 때는 데이터베이스 성능이 저하되지 않도록 신중히 계획해야 합니다. 대형 테이블에 인덱스를 만들 경우 클러스터형 인덱스로 시작하고 그 후에 비클러스터형 인덱스를 작성하는 것이 좋습니다. 기존 테이블에 인덱스를 만들 때는 ONLINE 옵션을 ON으로 설정하는 것이 좋습니다. 이 옵션을 ON으로 설정하면 테이블이 장기간 잠기지 않으므로 기본 테이블에 대한 쿼리나 업데이트를 계속할 수 있습니다. 자세한 내용은 온라인으로 인덱스 작업 수행을 참조하십시오.
구현 고려 사항
다음 표에서는 클러스터형 인덱스, 비클러스터형 인덱스, 공간 인덱스, 필터링된 인덱스 및 XML 인덱스에 적용되는 최대값을 나열합니다. 이 값을 지정하지 않으면 모든 인덱스 유형에 제한값이 적용됩니다.
최대 인덱스 제한 |
값 |
추가 정보 |
---|---|---|
각 테이블의 클러스터형 인덱스 수 |
1 |
|
각 테이블의 비클러스터형 인덱스 수 |
999 |
PRIMARY KEY 또는 UNIQUE 제약 조건을 사용하여 생성된 비클러스터형 인덱스 및 필터링된 인덱스를 포함하지만 XML 인덱스는 포함하지 않습니다. |
각 테이블의 XML 인덱스 수 |
249 |
xml 데이터 형식 열의 기본 및 보조 XML 인덱스를 포함합니다. |
각 테이블의 공간 인덱스 수 |
249 |
|
각 인덱스의 키 열 수 |
16* |
테이블에 기본 XML 인덱스 또는 공간 인덱스도 있는 경우 클러스터형 인덱스는 15개 열로 제한됩니다. |
인덱스 키 레코드 크기 |
900바이트* |
XML 인덱스 또는 공간 인덱스에는 적용하지 마십시오. 공간 인덱스를 지원하는 테이블의 경우 최대 인덱스 키 레코드 크기는 895바이트입니다. |
*비클러스터형 인덱스의 레코드 크기 제한 및 인덱스 키 열을 피하려면 인덱스에 키가 아닌 열을 포함합니다. 자세한 내용은 포괄 열이 있는 인덱스를 참조하십시오.
데이터 형식
일반적으로 테이블이나 뷰의 모든 열을 인덱싱할 수 있습니다. 다음 표에서는 인덱스 참여가 제한된 데이터 형식을 나열합니다.
데이터 형식 |
인덱스 참여 |
추가 정보 |
---|---|---|
CLR 사용자 정의 형식 |
이진 순서 지정을 지원하는 유형인 경우 인덱싱할 수 있습니다. |
|
LOB(Large Object) 데이터 형식: image, ntext, text, varchar(max), nvarchar(max), varbinary(max) 및 xml |
인덱스 키 열이 될 수 없습니다. 그러나 XML 열은 테이블의 기본 또는 보조 XML 인덱스의 키 열이 될 수 있습니다. image, ntext 및 text를 제외하고 비클러스터형 인덱스에 키가 아닌 포함된 열로 참여할 수 있습니다. 계산 열 식의 일부인 경우 참여할 수 있습니다. |
|
계산 열 |
인덱싱할 수 있습니다. 여기에는 메서드가 결정적으로 표시되는 경우 CLR 사용자 정의 형식 열의 메서드 호출로 정의된 계산 열이 포함됩니다. 계산 열 데이터 형식이 인덱스 키 열이나 키가 아닌 열로 허용되는 경우 LOB 데이터 형식에서 파생된 계산 열을 키 열이나 키가 아닌 열로 인덱싱할 수 있습니다. |
|
행 외부로 밀어넣은 Varchar 열 |
클러스터형 인덱스의 인덱스 키는 기존 데이터가 ROW_OVERFLOW_DATA 할당 단위에 있는 varchar 열을 포함할 수 없습니다. 클러스터형 인덱스를 varchar 열에 만들고 기존 데이터가 IN_ROW_DATA 할당 단위에 있는 경우에는 데이터를 행 외부로 밀어넣을 열에서 다음 삽입 작업이나 업데이트 동작이 실패합니다. |
|
geometry |
여러 개의 공간 인덱스를 사용하여 인덱싱할 수 있습니다. |
기타 고려 사항
다음은 인덱스를 만들 때 고려해야 할 추가 사항입니다.
테이블에 대한 CONTROL 또는 ALTER 권한이 있으면 인덱스를 만들 수 있습니다.
생성되는 인덱스는 자동으로 활성화되어 사용 가능한 상태가 됩니다. 인덱스에 액세스하지 못하도록 인덱스를 비활성화할 수 있습니다. 자세한 내용은 인덱스 비활성화를 참조하십시오.
디스크 공간 요구 사항
인덱스 저장에 필요한 디스크 공간은 다음 요소에 따라 다릅니다.
테이블의 각 데이터 행 크기와 각 페이지의 행 수. 인덱스를 만들기 위해 디스크에서 읽어야 할 데이터 페이지 수를 결정합니다.
사용되는 인덱스의 열과 데이터 형식. 디스크에 기록되어야 하는 인덱스 페이지 수를 결정합니다. 자세한 내용은 클러스터형 인덱스의 크기 예측 및 비클러스터형 인덱스의 크기 예측을 참조하십시오.
인덱스 생성 과정에 필요한 임시 디스크 공간. 자세한 내용은 인덱스 디스크 공간 요구 사항 확인을 참조하십시오.
성능 고려 사항
인덱스를 만드는 데 실제로 소요되는 시간은 디스크 하위 시스템에 따라 크게 다릅니다. 고려해야 할 주요 요소는 다음과 같습니다.
데이터베이스의 복구 모델. 대량 로그 복구 모델은 인덱스 생성 작업 시 전체 복구보다 성능이 뛰어나고 보다 적은 로그 공간을 사용합니다. 그러나 대량 로그 복구를 사용하면 지정 시간 복구를 위한 유연성이 떨어집니다. 자세한 내용은 인덱스 작업에 대한 복구 모델 선택을 참조하십시오.
데이터베이스 및 트랜잭션 로그 파일 저장에 사용되는 RAID(Redundant Array of Independent Disks) 수준. 일반적으로 스트라이프를 사용하는 RAID 수준의 I/O 대역폭 성능이 좋습니다.
RAID를 사용하는 경우 디스크 배열의 디스크 수. 배열에 드라이브가 많을수록 데이터 전송 속도가 빨라집니다.
데이터의 중간 정렬 결과 저장 위치. SORT_IN_TEMPDB 옵션을 사용하면 tempdb가 사용자 데이터베이스와 다른 디스크 세트에 있을 경우 인덱스 생성에 필요한 시간이 단축될 수 있습니다. 자세한 내용은 tempdb 및 인덱스 만들기를 참조하십시오.
오프라인 또는 온라인으로 인덱스 생성
기본값에 따라 인덱스가 오프라인으로 생성되면 인덱스를 생성하는 트랜잭션이 완료될 때까지 기본 테이블이 배타적으로 잠깁니다. 따라서 인덱스가 생성되는 동안 사용자가 테이블에 액세스할 수 없습니다.
XML 및 공간 인덱스를 제외하고 인덱스가 온라인으로 생성되도록 지정할 수 있습니다. 온라인 옵션을 ON으로 설정하면 테이블이 장기간 잠기지 않으므로 인덱스가 생성되는 동안 기본 테이블에 대한 쿼리나 업데이트를 계속할 수 있습니다. 온라인 인덱스 작업을 사용하는 것이 좋지만 사용자 환경과 특정 요구 사항을 고려해야 합니다. 경우에 따라 오프라인으로 인덱스 작업을 실행하는 것이 나을 수도 있습니다. 오프라인 인덱스 작업을 사용하면 작업 시 사용자의 데이터 액세스가 제한되지만 작업이 보다 빨리 완료되고 보다 적은 리소스가 사용됩니다. 자세한 내용은 온라인으로 인덱스 작업 수행을 참조하십시오.
테이블을 만들 때 PRIMARY KEY 또는 UNIQUE 제약 조건을 만들려면
기존 테이블에 PRIMARY KEY 또는 UNIQUE 제약 조건을 만들려면
인덱스를 만들려면
변경 내역
업데이트된 내용 |
---|
비클러스터형 인덱스 제한을 999로 업데이트했습니다. |