일반 인덱스 디자인 지침
경험이 많은 데이터베이스 관리자는 인덱스를 잘 디자인할 수 있습니다. 그러나 데이터베이스와 작업이 조금만 복잡해져도 이 태스크는 복잡하고 시간이 많이 걸리며 오류가 쉽게 발생할 수 있습니다. 데이터베이스, 쿼리 및 데이터 열의 특성을 이해하면 최적의 인덱스를 디자인할 수 있습니다.
데이터베이스 고려 사항
인덱스를 디자인할 때 다음과 같은 데이터 베이스 지침을 고려합니다.
테이블에 인덱스가 너무 많으면 테이블의 데이터가 변경될 경우 인덱스도 모두 적절하게 조정되어야 하므로 INSERT, UPDATE, DELETE 및 MERGE 문의 성능이 저하될 수 있습니다.
과도하게 업데이트되는 테이블에 대한 인덱스를 너무 많이 만들지 말고 가능한 열 수가 적은 좁은 인덱스를 만듭니다.
많은 인덱스를 사용하면 업데이트 요구는 적지만 데이터 양이 많은 테이블의 쿼리 성능이 향상될 수 있습니다. 인덱스 수가 많으면 SELECT 문과 같이 데이터를 수정하지 않는 쿼리의 성능이 향상될 수 있습니다. 이는 쿼리 최적화 프로그램이 가장 빠른 액세스 방법을 결정할 때 선택할 수 있는 인덱스가 더 많기 때문입니다.
작은 테이블에 대한 인덱스를 만들면 비효율적일 수 있습니다. 이는 쿼리 최적화 프로그램이 간단한 테이블 스캔을 수행하는 시간보다 데이터를 검색하기 위해 인덱스를 통과하는 시간이 더 길 수 있기 때문입니다. 따라서 작은 테이블에 대한 인덱스는 전혀 사용되지 않을 수도 있지만 테이블의 데이터가 변경될 때마다 유지 관리되어야 합니다.
뷰에 집계, 테이블 조인 또는 집계와 조인의 조합이 포함되어 있으면 뷰에 대한 인덱스 성능이 크게 향상될 수 있습니다. 쿼리 최적화 프로그램은 뷰를 사용하기 위해 쿼리에 뷰를 명시적으로 참조할 필요가 없습니다. 자세한 내용은 인덱싱된 뷰 디자인을 참조하십시오.
데이터베이스 엔진 튜닝 관리자를 사용하여 데이터베이스를 분석하고 인덱스 권장 구성을 만들 수 있습니다. 자세한 내용은 데이터베이스 엔진 튜닝 관리자 이해를 참조하십시오.
쿼리 고려 사항
인덱스를 디자인할 때 다음과 같은 쿼리 지침을 고려합니다.
쿼리의 조건자 및 조인 조건에서 자주 사용되는 모든 열에 대해 비클러스터형 인덱스를 만듭니다.
중요 불필요한 열은 추가하지 마십시오. 인덱스 열을 너무 많이 추가하면 디스크 공간 및 인덱스 유지 관리 성능이 떨어질 수 있습니다.
인덱스를 포함하면 쿼리의 요구 사항을 만족시키는 데 필요한 모든 데이터가 인덱스 자체 내에 있기 때문에 쿼리 성능이 향상될 수 있습니다. 즉, 테이블이나 클러스터형 인덱스의 데이터 페이지가 아니라 인덱스 페이지만 있으면 요청된 데이터를 검색할 수 있으므로 전체적인 디스크 I/O가 줄어듭니다. 예를 들어 a, b 및 c 열에 대해 만든 복합 인덱스가 포함된 테이블에서 a와 b 열을 쿼리하면 지정된 데이터를 인덱스 자체에서만 검색할 수 있습니다.
여러 개의 쿼리를 사용하여 동일한 여러 행을 업데이트하는 대신 단일 문에 가능한 많은 행을 삽입하거나 수정하는 쿼리를 작성합니다. 문을 하나만 사용하면 최적화된 인덱스 유지 관리가 수행될 수 있습니다.
쿼리 유형 및 쿼리에서 열이 사용되는 방법을 평가합니다. 예를 들어 정확히 일치하는 쿼리 유형에서 사용되는 열은 비클러스터형 또는 클러스터형 인덱스로 만들면 좋습니다. 자세한 내용은 쿼리 유형 및 인덱스를 참조하십시오.
열 고려 사항
인덱스를 디자인할 때 다음과 같은 열 지침을 고려합니다.
클러스터형 인덱스의 인덱스 키 길이는 짧게 유지합니다. 또한 클러스터형 인덱스는 고유하거나 Null이 아닌 열에 만들어지는 이점이 있습니다. 자세한 내용은 클러스터형 인덱스 디자인 지침을 참조하십시오.
ntext, text, image, varchar(max), nvarchar(max) 및 varbinary(max) 데이터 형식으로 되어 있는 열은 인덱스 키 열로 지정될 수 없습니다. 하지만 varchar(max), nvarchar(max), varbinary(max) 및 xml 데이터 형식은 비클러스터형 인덱스에 키가 아닌 인덱스 열로 참여할 수 있습니다. 자세한 내용은 포괄 열이 있는 인덱스를 참조하십시오.
xml 데이터 형식은 XML 인덱스의 키 열만 될 수 있습니다. 자세한 내용은 XML 데이터 형식 열의 인덱스를 참조하십시오.
열이 고유한지 조사합니다. 동일한 열 조합에서 고유하지 않은 인덱스 대신 고유한 인덱스를 만들면 인덱스를 보다 유용하게 만드는 추가 정보가 쿼리 최적화 프로그램에 제공됩니다. 자세한 내용은 고유 인덱스 디자인 지침을 참조하십시오.
열의 데이터 분산을 조사합니다. 고유한 값이 거의 없는 열을 인덱싱하거나 그러한 열에 대해 조인을 수행하면 쿼리 실행 시간이 길어지는 경우가 많습니다. 이는 데이터와 쿼리의 근본 문제이므로 일반적으로 이러한 상황을 확인하지 않고는 해결할 수 없습니다. 예를 들어 이름이 알파벳순으로 정렬된 실제 전화 번호부에서 해당 도시의 모든 사람 이름이 Smith 또는 Jones이면 특정 사람을 신속하게 찾을 수 없습니다. 데이터 분산에 대한 자세한 내용은 통계를 사용하여 쿼리 성능 향상를 참조하십시오.
잘 정의된 하위 집합이 포함된 열(예: 스파스 열, 값이 대부분 NULL인 열, 특정 범주의 값이 있는 열 및 특정 범위의 값이 있는 열)에 필터링된 인덱스를 사용해 보십시오. 잘 디자인된 필터링된 인덱스는 쿼리 성능을 개선하고 인덱스 유지 관리 비용과 저장소 비용을 줄일 수 있습니다. 자세한 내용은 필터링된 인덱스 디자인 지침을 참조하십시오.
인덱스에 여러 개의 열이 포함될 경우 열 순서를 고려합니다. 같음(=), 보다 큼(>), 보다 작음(<) 또는 BETWEEN 검색 조건의 WHERE 절에서 사용되거나 조인에 참여하는 열은 맨 앞에 배치해야 합니다. 추가 열은 고유성 수준에 따라 가장 고유한 열에서 가장 고유하지 않은 열의 순서로 정렬되어야 합니다.
예를 들어 인덱스가 LastName, FirstName으로 정의되는 경우 이 인덱스는 검색 조건이 WHERE LastName = 'Smith' 또는 WHERE LastName = Smith AND FirstName LIKE 'J%'인 경우 유용합니다. 그러나 쿼리 최적화 프로그램은 FirstName (WHERE FirstName = 'Jane')에 대해서만 검색한 쿼리에는 인덱스를 사용하지 않습니다.
계산 열의 인덱싱을 고려합니다. 자세한 내용은 계산 열에 인덱스 만들기를 참조하십시오.
인덱스 특성
인덱스가 쿼리에 적합하다고 판단되면 사용자의 상황에 가장 잘 맞는 인덱스 형식을 선택할 수 있습니다. 인덱스 특성은 다음과 같습니다.
클러스터형 인덱스와 비클러스터형 인덱스
고유한 인덱스와 고유하지 않은 인덱스
하나의 열로 구성된 인덱스와 여러 열로 구성된 인덱스
인덱스의 열에서 오름차순 또는 내림차순
전체 테이블과 비클러스터형 인덱스 필터링
FILLFACTOR 같은 옵션을 설정하면 인덱스의 초기 저장소 특성을 사용자 지정하여 성능이나 유지 관리를 최적화할 수도 있습니다. 자세한 내용은 인덱스 옵션 설정을 참조하십시오. 또한 파일 그룹이나 파티션 구성표를 사용하면 인덱스 저장소 위치를 확인하여 성능을 최적화할 수 있습니다. 자세한 내용은 인덱스를 파일 그룹에 배치를 참조하십시오.