2017-11-29 4 views
0

테이블에 인덱스를 만드는 데 사용하는 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

+0

[클러스터 된 인덱스 및 클러스터되지 않은 인덱스] (https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described) : "인덱스 행의 포인터 비 클러스터형 인덱스에서 데이터 행에 대한 행을 로케이터라고하며 행 로케이터의 구조는 ... 클러스터 된 테이블의 경우 행 로케이터는 클러스터 된 인덱스 키입니다. " 따라서 PK가 클러스터 된 경우 "기본 키를 사용하여 데이터를 검색하는 데 사용되지 않습니다"라는 가정이 잘못되었습니다. –

답변

1

사용은

CREATE NONCLUSTERED INDEX KeyName2 
ON Person ([First Name], [Last Name], [PersonID]) 

는 PersonID 암시 적으로 식별하는 키 이름에 추가됩니다

CREATE NONCLUSTERED INDEX KeyName 
ON Person ([First Name], [Last Name]) 

사이에 저장 차이가 없다 데이터 행 또한

CREATE UNIQUE NONCLUSTERED INDEX KeyName3 
ON Person ([First Name], [Last Name], [PersonID) 

CREATE NONCLUSTERED INDEX KeyName4 
ON Person ([First Name], [Last Name], [PersonID]) 

는 기능상 동일하다. 기본 키가 명시 적으로 키 열로 포함될 때마다 기본 키 값에 의해서만 적용되는 경우에도 색인은 기술적으로 고유 색인입니다. KeyName3에 고유 한 한정자를 추가하면 SQL Server가 기본 키의 존재로 이미 보장되는 세 열 모두의 조합의 고유성을 계속 확인하므로 리소스가 낭비됩니다.

클러스터 된 키는 클러스터 된 인덱스의 데이터 행을 가리 키기 위해 모든 비 클러스터형 인덱스에 포함됩니다. 클러스터링 키가 기본 키 또는 고유 키인 경우 키 값은 데이터 행을 식별하는 데 사용됩니다. 클러스터링 키가 고유 한 값이 아닌 경우 SQL Server는 각 데이터 행에 고유 한 값을 추가하여 식별 할 수 있도록합니다. 그러나 추가 행을 삽입/삭제할 수있는 패딩이 있기 때문에 실제로 행 번호가 아닙니다.그 추가 값은 정렬 목적을위한 명시 적 인덱스 키 다음으로 간주됩니다.

클러스터 된 인덱스 (힙)가없는 경우 암시 적 고유 값을 사용하여 데이터 행을 가리 킵니다. 그러나 데이터를 정렬하는 인덱스 키가 없으면 행이 순서를 변경하지 않으므로 패딩이없고 고유 한 값이 사실 행 번호입니다.