2012-04-21 3 views
42

테이블이 countries이고 SQL Server 2008 R2에서 "고유 키"유형의 "인덱스/키"를 만들어서 country_name 열을 고유하게 정의합니다.SQL Server 2008의 고유 키 대 고유 인덱스

하지만 다음과 같은 질문이 있습니다

  1. 유형의 "인덱스/키" "고유 키"를 만드는 것을 자동으로이 열에 클러스터되지 않은 인덱스를 만들?
  2. 유형을 "고유 키"에서 "색인"으로 변경하고 IsUnique 값을 "예"로 유지하면 차이가 있습니까?
  3. 그래서 두 가지 옵션이 있습니다. "고유 키"와 "인덱스"두 가지가 같다고 생각합니까?

답변

59

유일한 제약 조건은 고유 한 인덱스로 장면 뒤에서 구현되므로 사용자가 지정하는 방법과 관계가 없습니다.

ALTER TABLE dbo.foo ADD CONSTRAINT UQ_bar UNIQUE(bar); 

어떤 사람들은, 예를 들어, 대신 고유 인덱스를 만들 : 나는 단순히 그것을 구현하는 경향이

CREATE UNIQUE INDEX IX_UQ_Bar ON dbo.foo(bar); 

의 차이는 의도에서 - 당신은 고유성/비즈니스 규칙을 적용 할 제약 조건을 만드는 경우, 당신은 쿼리 성능을 지원하기 위해 그렇게하는 경우, 제약 조건을 만들을 생성하는 것이 더 논리적 수 있습니다 고유 색인. 다시 말하지만, 그것은 동일한 구현이지만, 당신이가는 길은 당신의 의도를 문서화하는데 도움이 될 수 있습니다.

이전의 Sybase 기능을 모두 준수하고 ANSI 표준을 준수하는 여러 가지 옵션이 있다고 생각합니다. 고유 한 제약 조건은 표준 100 %를 준수하지 않지만 하나의 NULL 값만 허용하므로 반면에 고유 인덱스는 WHERE 절 (WHERE col IS NOT NULL)을 SQL Server 2008 이상에 추가하여이 문제를 해결할 수 있습니다.

+0

정보 차별화는 확실하지 않지만, 'sys.indexes'는'is_unique_constraint' 열을 가지고있어 인덱스가 고유 인덱스 대신 제약 조건으로 정의되었는지 알 수 있습니다. –

+1

@Andre Yep, 메타 데이터에있는 열입니다. 따라서 * 사용자 *가 원래 제약 조건으로 선언되었는지 확인할 수 있습니다. 그렇다고해서 의도에 대해 알려주는 것은 아니며 인덱스 자체의 물리적 구현 및 독창성 적용은 동일합니다. –

10

언급 할 점이 하나 있는데, 인덱스를 작성하면 포함 된 열을 지정할 수 있기 때문에 country_name으로 검색 할 때 SQL 코드가 더 빨리 작동하는 데 도움이 될 수 있습니다.

CREATE UNIQUE NONCLUSTERED INDEX IX_UQ_Bar 
ON dbo.foo (
    bar 
) 
INCLUDE (foo_other_column) 
GO 

SELECT foo_other_column FROM Foo WHERE bar = 'test' 

SQL 서버는 인덱스 자체에 "foo_other_column"을 저장합니다. 고유 한 제한 조건의 경우, 먼저 'test'의 색인을 찾은 다음 foo 테이블에서 행을 검색하고 "foo_other_column"을 취합니다.