2012-05-22 14 views
31

私は、SQL Server 2008のデータベースを作成しています、データベース:主キー、クラスタ化または非クラスタ化

CREATE TABLE Users 
(
    U_Id INT NOT NULL 
    FirstName VARCHAR(50) NOT NULL, 
    LastName VARCHAR(50) NOT NULL, 
    Email VARCHAR(200) 
    Password VARCHAR(50) 
) 

私はU_ID主キーにしたいです。 私は

CONSTRAINT pk_UserID PRIMARY KEY (U_Id) 

この

CONSTRAINT pk_UserID PRIMARY KEY CLUSTERED (U_Id) 

この

CONSTRAINT pk_UserID PRIMARY KEY NONCLUSTERED (U_Id) 

それぞれを使用するには、違いが何であるかをお尋ねしたいの?

私はいくつかの記事を読んだが、まだ私には不明である。誰かが私に簡単な説明を教えてもらえますか?

答えて

36

次の文:

CONSTRAINT pk_UserID PRIMARY KEY (U_Id) 

は、この1と同じです。

CONSTRAINT pk_UserID PRIMARY KEY CLUSTERED (U_Id) 

あなただけがインデックスの順テーブルデータの物性を持ち、デフォルトですることができますindexは主キーに使用されるインデックスです(主キーの一意制約は常にインデックスによってサポートされます)。

あなたは、あなたが持つ主キーを作成する必要があり、いくつかの他の指標に応じて格納されるテーブルデータの順序を残しておきたい場合は、次の

CONSTRAINT pk_UserID PRIMARY KEY NONCLUSTERED (U_Id) 

をし、次いで、クラスタ化インデックスを作成します。

CREATE CLUSTERED INDEX ix_Email ON Users (Email); 
+3

クラスタ化されていないインデックスを作成すると、クラスタ化インデックスにデータが常に含まれることに注意してください(これは、テーブルの実際のデータ行がどのように見つかるためです)。 [Microsoft docs](http://msdn.microsoft.com/en-us/library/ms177484.aspx)大規模/ワイドインデックスをクラスタ化インデックスにすることでスペースを節約できるとは思わないテーブルに他のインデックスはありません。 – Granger

+1

主キーは、行の識別子です。一意で、nullでない必要があります。 Clustered Indexは、ディスクにデータを格納する方法をSQLに指示します。実際のデータ行は、このインデックスで指定された順序で格納されます。データがディスク上のどこに格納されているかに関するデータも含まれているため、クラスタ化インデックスキーはすべてのインデックスに格納されます。 ほとんどの場合、これらを同じにすることをお勧めします。また、データがディスクに順次格納されるように、主キーを識別子にすることは、ほとんど常に最良です。 – brianfeucht

関連する問題