2016-09-04 11 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インデックスに一意性を強制する方法は3つあります。彼らがクラスタ化または非クラスタ化されているかどうか

  • 主キー制約
  • ユニーク制約
  • ユニークインデックス(ベース制約はない)

は、インデックスを使用してユニークとして宣言されているかどうかに直交しますこれらの方法のいずれか。

3つの方法はすべて、クラスタ化インデックスまたは非クラスタ化インデックスを作成できます。

デフォルトでは、一意制約と一意インデックスは、異なるものを指定しない場合、クラスタ化されていないインデックスを作成します(クラスタ化インデックスが競合する場合、PKは既定でCLUSTEREDとして作成されます)。CLUSTERED/NONCLUSTEREDのいずれかです。

構文の例は、独自のSQL Serverは静かに彼らがユニークな任意の方法を行いますとして指定されていない索引の場合

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; 

です。クラスタード・インデックスの場合、これは、重複するキーにuniquefierを追加することによって行われます。クラスタ化されていない索引では、一意性を保証するために行識別子(論理または物理)がキーに追加されます。

+0

クラスタ化された/非クラスタ化インデックスを持つプライマリ&ユニークキーを作成する方法に関する参考文献を紹介してください。 プライマリキーがクラスタ化されていないインデックスである可能性がある場合、それはテーブルに複数のプライマリキーを持つことができるということを意味します。私はいくつかの詳細を私に提供してください、私は混乱する傾向があるほど多くを学ぶ傾向があります。 ありがとう –

+1

@ LijinJohn - テーブルごとに1つのプライマリキーを持つことができ、テーブルごとにインデックスを作成しますが、これらは同じである必要はありません。 –

+0

私がmsdnブログから学ぶ傾向があるのは、ユニークキーとユニーク制約の間にデータに関連する違いがないということです。 –

0

ユニークインデックスは、クラスタ化または非クラスタ化の両方に使用できます。 しかし、NULL可能な列がある場合、NULL値は一意でなければなりません(列がヌルの1行のみ)。 1つ以上のNULLを格納する場合は、「where columnName is not null」というフィルタを使用して索引を作成できます。提供

1

だけでなく、すべての答えは非常に有用だったが、それでも私は、テーブルが一つだけクラスタ化インデックスと含めることができます

  1. だけでなく、いくつかの他の人のために参考になるように、いくつかの詳細な回答を追加したいと思います主キーは で、クラスタ化/非クラスタ化インデックスにすることができます。
  2. ユニークキーがクラスタ化/非クラスタ化インデックスすることができ、同様、 は以下

シナリオ1は、例のいくつかである:主キーはこの場合、クラスタ化インデックス

にデフォルト設定されますが、我々プライマリキーのみを作成し、テーブル上に作成されたインデックスの種類を確認すると、自動的にクラスタ化インデックスが作成されていることがわかります。

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 Serverが自動的に作成されます。他の列にクラスタード・インデックスが指定されているため、非クラスター索引としての主キー。

-- 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:この場合、非クラスタ化インデックス

に他のインデックスはデフォルトでクラスタ化インデックスの主キーのデフォルト我々は両方のテーブル上の2つのインデックスを作成しますが、我々は指定しません。列のインデックスの型。結果を確認すると、主キーは自動的にClustered Indexにデフォルト設定され、別の列は非クラスタ化インデックスとして自動的に設定されます。

-- 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

関連する問題