테이블에 인덱스를 만드는 데 사용하는 API는 모든 비 클러스터형 인덱스를 기본 키가 포함 된 고유 인덱스로 만듭니다.클러스터되지 않은 인덱스 : 기본 키를 포함한 고유 인덱스와 기본 키가없는 고유하지 않은 인덱스
이CREATE TABLE Person
(
[PersonID] INT NOT NULL PRIMARY KEY, -- clustered key on this col.
[First Name] VARCHAR(50),
[Last Name] VARCHAR(50),
[Other Columns] VARCHAR(50)
)
API에 의해 생성 된 비 클러스터형 인덱스에 대한 SQL 문이 같은 같습니다 :
그래서 다음 표 주어진 인덱스의 기본 키를 포함하여CREATE UNIQUE NONCLUSTERED INDEX KeyName
ON Person ([First Name], [Last Name], [PersonID])
그것을 모든 항목이 고유하다는 것을 확신합니다.
는 개인적으로 나는 이런 식으로 인덱스를 생성 한 것 :
CREATE NONCLUSTERED INDEX KeyName2
ON Person ([First Name], [Last Name])
나는 약 21 만 기록을 포함하는 테이블에 두 번 다음 한 Statment을 사용했다. 한 번에 하나의 색인 만 활성화되었습니다.
SELECT *
FROM Person
WHERE [First Name] = 'John'
AND [Last Name] = 'Doe'
은 "예상 CPU 비용", "예상 I/O 비용", "예상 연산자 비용"과 "예상 하위 트리 비용"에 상관없이 사용할 수/사용할 수 있었는지 인덱스 정확히 같은 없었다.
클러스터되지 않은 인덱스에 대한 나의 이해는 어쨌든 SQL-Server가 독립적으로 할당하는 행 번호를 사용하여 데이터를 검색하는 데 기본 키가 사용되지 않는다는 것입니다. 따라서 NON-UNIQUE 인덱스에 대해 UNIQUE 인덱스를 사용하면 어떤 이점이 있습니까?
UNIQUE 인덱스가 하나 이상의 열을 포함하고 있기 때문에 더 많은 디스크 공간을 차지한다고 나는 생각합니다. 그 때문에 나는 후자의 버전을 선호 할 것이다.
PersonID이 기본 키의 경우 SQL-서버 2012
[클러스터 된 인덱스 및 클러스터되지 않은 인덱스] (https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described) : "인덱스 행의 포인터 비 클러스터형 인덱스에서 데이터 행에 대한 행을 로케이터라고하며 행 로케이터의 구조는 ... 클러스터 된 테이블의 경우 행 로케이터는 클러스터 된 인덱스 키입니다. " 따라서 PK가 클러스터 된 경우 "기본 키를 사용하여 데이터를 검색하는 데 사용되지 않습니다"라는 가정이 잘못되었습니다. –