2016-09-04 16 views
2

SQL Server를 처음 사용하고 클러스터 된 인덱스에 대해 배우는 동안 혼란 스러웠습니다.SQL Server의 고유 키 클러스터 된 인덱스 또는 비 클러스터 인덱스입니까?

클러스터 된 고유 키 또는 클러스터되지 않은 인덱스입니까? 고유 키는 null을 포함하는 열의 고유 값만 보유하므로이 개념에 따라 고유 키는 클러스터 된 인덱스 여야합니다. 맞습니까? 이 글을 통해 갈 때 당신은 UNIQUE 제약 조건을 만들 때하지만

MSDN 혼란있어, 고유 비 클러스터형 인덱스는 기본적으로 UNIQUE 제약 조건을 적용하기 위해 만들어 입니다. 테이블의 클러스터 된 인덱스에 이 이미있는 경우 고유 클러스터 된 인덱스를 지정할 수 있습니다.

더 나은 방식으로 개념을 이해하도록 도와주세요. 감사합니다.

+1

앞에'unique' 키, 클러스터되지 않습니다. –

+0

http://stackoverflow.com/questions/1251636/what-do-clustered-and-non-clustered-index-actually-mean 및 https://msdn.microsoft.com/en-CA에서 조금 더 잘 설명되어 있습니다. /library/ms190457.aspx. – yelxe

답변

3

SQL Server 인덱스에서 고유성을 적용하는 세 가지 방법이 있습니다.

  • 기본 키 제약 조건
  • 고유 제약
  • 고유 인덱스 (기반 제약되지 않음)

그들은 클러스터 또는 인덱스를 사용하여 독특한로 선언되어 있는지 여부에 클러스터되지 않은 것은 직교 여부 이러한 방법 중 하나.

세 가지 방법 모두 클러스터형 또는 비 클러스터형 인덱스를 만들 수 있습니다.

기본 당신이 어떤 다른를 지정하지 (과 충돌하는 클러스터 된 인덱스가 존재하지 않는 경우는 PK가 기본적으로 CLUSTERED으로 생성됩니다) 경우 클러스터되지 않은 인덱스를 생성합니다 고유 제한 조건 및 고유 인덱스를

하지만 당신은 명시 적으로 CLUSTERED를 지정할 수 있습니다/NONCLUSTERED.

예 구문은 고유의 SQL 서버로 지정되지 않은 인덱스에 대한

CREATE TABLE T 
(
X INT NOT NULL, 
Y INT NOT NULL, 
Z INT NOT NULL 
); 

ALTER TABLE T ADD PRIMARY KEY NONCLUSTERED(X); 

--Unique constraint NONCLUSTERED would be the default anyway 
ALTER TABLE T ADD UNIQUE NONCLUSTERED(Y); 

CREATE UNIQUE CLUSTERED INDEX ix ON T(Z); 

DROP TABLE T; 

가 자동으로 어떤 방식으로 그들을 특별하게 만드는 것입니다. 클러스터 된 인덱스의 경우 이는 중복 키에 고유 한 정보를 추가하여 수행됩니다. 비 클러스터형 인덱스의 경우 유일성을 보장하기 위해 키에 행 식별자 (논리적 또는 물리적)가 추가됩니다.

+0

클러스터 된/클러스터되지 않은 인덱스가있는 기본 및 고유 키를 만드는 방법에 대한 참조가 나와 함께 안내 할 수 있습니다. 기본 키가 클러스터되지 않은 인덱스가 될 수있는 경우 테이블에 둘 이상의 기본 키가있을 수 있음을 의미합니까? 어떻게 할 수 있습니까? 제발 좀 더 자세히 설명해 주시겠습니까? 더 많은 것을 배우는 경향이 많을수록 혼란 스럽습니다. 감사합니다. –

+1

@LijinJohn - 테이블 당 하나의 기본 키만 가질 수 있으며 클러스터 된 하나만 가질 수 있습니다. 표 당 색인하지만 이것들은 똑같을 필요는 없습니다. –

+0

내가 msdn 블로그에서 배우는 경향이있는 것은 고유 키와 고유 제약 사이에 데이터 관련 차이가 없다는 것입니다. 맞습니까? –

0

고유 인덱스는 클러스터링되거나 클러스터되지 않을 수 있습니다. 그러나 null 허용 열이있는 경우 NULL 값은 고유해야합니다 (열이 null 인 경우에만 1 행). 1 개 이상의 NULL을 저장하려는 경우 "where columnName is not null"필터를 사용하여 인덱스를 만들 수 있습니다. 제공

1

아니라 모든 해답은 매우 도움이되었다,하지만 여전히 나는 테이블은 하나의 클러스터 된 인덱스와를 포함 할 수 있습니다

  1. 아니라 일부 다른 사람을 위해 도움이 될 수 있도록 몇 가지 상세한 답을 추가하고 싶습니다 기본 키 은 클러스터 된/클러스터되지 않은 인덱스가 될 수 있습니다.
  2. 고유 키가 클러스터/클러스터되지 않은 인덱스 할 수 있습니다뿐만 아니라, 아래

시나리오 1은 예제의 일부입니다 : 기본 키가이 경우 클러스터 된 인덱스

로 설정됩니다 우리 Primary Key 만 생성하고 테이블에 생성 된 인덱스의 종류를 확인하면 자동으로 클러스터 된 인덱스가 생성되었음을 알 수 있습니다.

USE TempDB 
GO 
-- Create table 
CREATE TABLE TestTable 
(ID INT NOT NULL PRIMARY KEY, 
Col1 INT NOT NULL) 
GO 
-- Check Indexes 
SELECT OBJECT_NAME(OBJECT_ID) TableObject, 
[name] IndexName, 
[Type_Desc] FROM sys.indexes 
WHERE OBJECT_NAME(OBJECT_ID) = 'TestTable' 
GO 
-- Clean up 
DROP TABLE TestTable 
GO 

시나리오 2 : 우리는 명시 적으로 클러스터되지 않은 인덱스로 기본 키를 정의하고이 비로 만들 것이다 기본 키가이 경우 클러스터되지 않은 인덱스

으로 정의된다 클러스터 된 인덱스 기본 키는 클러스터되지 않은 인덱스가 될 수 있음을 증명합니다.

USE TempDB 
GO 
-- Create table 
CREATE TABLE TestTable 
(ID INT NOT NULL PRIMARY KEY NONCLUSTERED, 
Col1 INT NOT NULL) 
GO 
-- Check Indexes 
SELECT OBJECT_NAME(OBJECT_ID) TableObject, 
[name] IndexName, 
[Type_Desc] FROM sys.indexes 
WHERE OBJECT_NAME(OBJECT_ID) = 'TestTable' 
GO 
-- Clean up 
DROP TABLE TestTable 
GO 

시나리오 3 : 우리가 다른 컬럼에 클러스터 된 인덱스를 생성합니다이 경우 클러스터 된 인덱스

로 정의 된 다른 열이 클러스터되지 않은 인덱스에 기본 키의 기본값은 SQL 서버가 자동으로 생성됩니다 클러스터 된 인덱스가 다른 열에 지정되므로 클러스터되지 않은 인덱스로 기본 키.

-- Case 3 Primary Key Defaults to Non-clustered Index 
USE TempDB 
GO 
-- Create table 
CREATE TABLE TestTable 
(ID INT NOT NULL PRIMARY KEY, 
Col1 INT NOT NULL UNIQUE CLUSTERED) 
GO 
-- Check Indexes 
SELECT OBJECT_NAME(OBJECT_ID) TableObject, 
[name] IndexName, 
[Type_Desc] FROM sys.indexes 
WHERE OBJECT_NAME(OBJECT_ID) = 'TestTable' 
GO 
-- Clean up 
DROP TABLE TestTable 
GO 

시나리오 4 : 우리는 모두 테이블에 두 개의 인덱스를 생성하지만 우리는 지정하지 않습니다이 경우 비 클러스터형 인덱스

다른 인덱스 기본값으로 클러스터 된 인덱스에 기본 키 기본값 열의 인덱스 유형. 결과를 확인할 때 기본 키는 자동으로 Clustered Index에 기본값으로 설정되고 다른 열은 Non-clustered 인덱스로 자동 설정됩니다.

-- Case 4 Primary Key and Defaults 
USE TempDB 
GO 
-- Create table 
CREATE TABLE TestTable 
(ID INT NOT NULL PRIMARY KEY, 
Col1 INT NOT NULL UNIQUE) 
GO 
-- Check Indexes 
SELECT OBJECT_NAME(OBJECT_ID) TableObject, 
[name] IndexName, 
[Type_Desc] FROM sys.indexes 
WHERE OBJECT_NAME(OBJECT_ID) = 'TestTable' 
GO 
-- Clean up 
DROP TABLE TestTable 
GO 

참조 : 명시 적으로`index` 생성의 "클러스터"옵션을 사용하여 정의하지 않는 한 the above details is been refrenced from this article