고유 인덱스 및 고유하지 않은 인덱스가 작업을 처리 할 수 있으므로 실제로 클러스터형 인덱스 나 기본 키를 만들 필요가 없습니다. SQL Server는 버전 1.1 이상부터 클러스터형 인덱스를 지원했지만 기본 키는 프로그래머가 고유 인덱스를 정의하여 적용한 "개념"입니다.
그러나 기본 키와 클러스터형 인덱스는 대부분의 데이터베이스에서 중요한 개념 인 것 같습니다.
아래에 표시된 것처럼 일부 인덱싱 옵션에 대한 부분 설명을 보려면 SQL Server 설명서를 살펴 보겠습니다.
클러스터형 인덱스 : https://msdn.microsoft.com/en-us/library/ms190457.aspx
- 클러스터형 인덱스는 키 값을 기준으로 테이블 또는 뷰에서 데이터 행을 정렬하고 저장합니다. 이들은 색인 정의에 포함 된 열입니다.
- 테이블 당 하나의 클러스터형 인덱스 만있을 수 있습니다
기본 키 : https://msdn.microsoft.com/en-us/library/ms190457.aspx
테이블에는 PRIMARY KEY 제약 조건이 하나만 포함될 수 있습니다.
PRIMARY KEY 제약 조건 내에 정의 된 모든 열은 NOT NULL로 정의해야합니다.
기본 키는 클러스터형 인덱스 (클러스터형 인덱스가없는 경우 기본값) 또는 비 클러스터형 인덱스로 만들 수 있습니다.
고유 색인 : https://msdn.microsoft.com/en-us/library/ms187019.aspx
즉, 클러스터형 인덱스 및 기본 키에 대한 질문은 실제로 다음 문제 중 일부에 관한 것입니다. 모든 테이블이 동일한 인덱싱 계획의 혜택을받는 것은 아닙니다.
기본 키와 클러스터형 인덱스를 분리하면 언제 혜택을 얻을 수 있습니까?
클러스터형 인덱스가 넓은 경우 (예 : 텍스트 열이 5 개이지만 설명하는 것처럼 기본 키가 작은 경우 (INT 또는 BIGINT)).
- 넓은 클러스터형 인덱스를 사용하면 클러스터형 인덱스 ( 테이블 이라고도 함) 에서 일련의 답변을 제공하는 쿼리의 하위 집합에 대해 인덱스에서 행을 빠르게 선택할 수 있습니다 . 예를 들어, 5 열 클러스터형 인덱스는 C1, C2, C3, C4, C5 또는 C1, C2, C3, C4 등을 C1까지 스캔하는 것을 지원합니다.
- 참고 : 행이 큰 경우 특히 테이블의 다른 열이 정기적으로 결과 집합에 포함 된 경우 일련 의 행 집합 을 선택하면 속도가 약간 향상 될 수 있습니다 .
- 이 경우 참조 무결성을 위해 기본 키 를 사용하여 필요한 값을 외래 키로 제공하여 다른 테이블의 행을 제한 할 수 있습니다. PK는 작으므로 FK는 참조 된 테이블 크기에 작은 영향을 미칩니다.
- 그러나 클러스터형 인덱스가있는 테이블에서 생성 된 인덱스는이 테이블에서 생성 한 다른 인덱스의 모든 클러스터 열을 포함합니다. 넓은 클러스터형 인덱스는 해당 테이블에있는 모든 비 클러스터형 인덱스의 크기를 확장합니다.
기본 키만 클러스터형 인덱스로 만들어야합니까?
기본 키 (INT 또는 BIGINT)가 작고 클러스터형 인덱스 인 경우 클러스터 열의 오버 헤드는 상대적으로 작습니다. 이 경우 클러스터 된 기본 키가이 테이블의 모든 인덱스에도 존재하지만 위에서 논의한 와이드 클러스터보다 지불 비용이 저렴합니다.
이 기본 키 클러스터형 인덱스는 일반적으로 많은 행을 직렬로 선택할 수있는 쉬운 경로를 직접 제공하지는 않습니다.
클러스터 된 기본 키를 만들었으므로 이전 에 클러스터 된 인덱스에 포함하려는 다른 열은 어떻습니까?
C1, C2, C3, C4, C5 열의 광범위한 검색 기준을 색인화하기 위해 필요에 따라 고유 (또는 고유하지 않은) 색인을 작성하십시오. 이“모방 클러스터 된”색인의 값은 해당 5 개의 열에 대한 빠른 검색 경로 역할을 할 수 있습니다. 정기적으로 선택되는 색인화되지 않은 열 또는 두 개가있는 경우을 사용하여 색인에 포함시킬 수 있습니다 INCLUDE (Doctor_Name, Diagnosis_Synopsis)
.
간단한 클러스터형 인덱스 및 기본 키가 유용하지만 테이블이나 데이터베이스에서 사용할지 여부를 고려해야 할 몇 가지 이유가 있습니다.
클러스터형 인덱스가 필요합니까?
클러스터 된 인덱스의 오버 헤드없이 인덱스 (고유 인덱스 및 비 고유 인덱스)를 만들고 기본 키를 정의하면 인덱스가 좁아 질수록 쿼리에 필요한 것을 제공 할 수 있습니다.
클러스터형 인덱스 및 기본 키에는 유용한 동작이 있지만 실제로 가장 중요한 인덱스라는 점을 기억하십시오. 응용 프로그램의 현실을 고려하여 인덱싱 전략을 설계하십시오. 아마도 OneBigTable
대부분의 테이블에 사용하는 것과 다른 인덱싱 전략이 필요할 수 있습니다.
클러스터형 인덱스가 없으면 데이터는 좋은 검색 메커니즘이 아닌 RID (Row Identifier)와 함께 힙 으로 저장됩니다 . 그러나 앞에서 언급했듯이 고유하고 고유하지 않은 인덱스를 만들어 쿼리를 처리 할 수 있습니다.
이제 힙을 고려할 수 있습니다.
힙 및 인덱스 : https://msdn.microsoft.com/en-us/library/hh213609.aspx
- 테이블이 힙으로 저장되면 개별 행은 파일 번호, 데이터 페이지 번호 및 페이지의 슬롯으로 구성된 행 ID (RID)를 참조하여 식별됩니다. 행 ID는 작고 효율적인 구조입니다. (그러나 색인 이 아닙니다 .)
- 때때로 데이터 아키텍트 는 비 클러스터형 인덱스를 통해 데이터에 액세스하고 RID가 클러스터형 인덱스 키보다 작은 경우 힙을 사용 합니다 .
그러나 빅 데이터 세트에 '핫스팟'이있는 경우 다른 유형의 인덱스를 조사 할 수도 있습니다.
필터링 된 인덱스 : https://msdn.microsoft.com/en-us/library/cc280372.aspx
그러나 기본 키와 클러스터형 인덱스를 모두 건너 뛸 수있는 가능성에 대해 관심이있는 경우 아래 링크 된 Markus Winand의 게시물을 읽을 수 있습니다. 그는 일부 코드 샘플을 사용하여 이러한 기능을 사용하는 것을 포기하는 것이 좋은 아이디어라고 제안하는 이유를 설명합니다.
http://use-the-index-luke.com/blog/2014-01/unreasonable-defaults-primary-key-clustering-key
그러나 마지막으로 응용 프로그램을 이해하고 수행중인 작업에 맞게 코드, 테이블, 인덱스 등을 디자인합니다.