2017-01-05 7 views
2

データベーステーブルを考える:SQLサーバーの複数フィールドプライマリキーにインデックスを作成する必要がありますか?

UserID (PK) 
SomeTypeID (PK) 
SomeSubTypeID (PK) 
Data 

そして、あなたが照会したい:

SELECT Data FROM Table WHERE UserID = {0} AND SomeTypeID = {1} AND SomeSubTypeID = {2} 

あなたはインデックスUserID, SomeTypeID, SomeSubTypeIDを作成する必要があるだろうか、彼らは主キーを形成するという事実は、これは必要ありません意味ですか?

+2

主キーはすでにソートのインデックスを作成しています。お互いに分離された他の列を照会したい場合を除き、主キーのみを使用することは問題ありません。詳細:https://msdn.microsoft.com/en-us/library/ms189039.aspx(Microsoft SQLを使用することを前提とします) –

+0

可能な複製... http://stackoverflow.com/questions/462477/sql-primary -key-and-index?rq = 1 –

答えて

3

表からデータを選択は:たとえば

CREATE TABLE TBL (UserID, SomeTypeID, SomeSubType, Data 
    CONSTRAINT PK PRIMARY KEY (UserID, SomeTypeID, SomeSubType)) 

そして、作成されているデフォルトのインデックスはCLUSTERED指標です。

通常そうではないすべての回)のデータを探していたとき、あなたはあなたのクエリがインデックスのキーを形成する列は、あなたが行をフィルタリングするために使用した行を、フィルタリングするNON-CLUSTEREDインデックスを使用したいと思いますあなたは以下のように、この場合DATAには、INCLUDED列としてそれらの行から復帰情報(列):

CREATE NONCLUSTERED INDEX ncl_indx 
ON TBL (UserID, SomeTypeID, SomeSubType) INCLUDE (Data); 

をこれを行うことにより、あなたはCLUSTEREDインデックスを通じて、テーブルのデータにアクセスして回避しています。あなたは、これがPRIMARY KEYのように定義されるようにしたいので、あなたではない、

CREATE TABLE TBL (UserID, SomeTypeID, SomeSubType, Data 
    CONSTRAINT PK PRIMARY KEY NONCLUSTERED (UserID, SomeTypeID, SomeSubType)); 

Buuut

しかし、あなたはあなたのPRIMARY KEYは、そうなりたいインデックスの種類を指定することができますINCLUDEの機能を使用することができますので、ディスクの検索を避けて、のインデックスを基本的に持つDATA列の情報を取得することはできません。

Buuuuuut、少数のディスクI/Oのようにしてくださいするように、主キーはINCLUDE機能から、あなたとの利益を与えることを一意性を確保するための方法がまだあります。

NONCLUSTERED INDEXUNIQUEと指定すると、インデックスキーを構成する3つの列すべてが一意であることが保証されます。

CREATE UNIQUE NONCLUSTERED INDEX ncl_indx 
ON TBL (UserID, SomeTypeID, SomeSubType) INCLUDE (Data); 

、これらのすべてを行うことで、あなたのテーブルにはHEAPwhich is not a very good thingになるだろう。テーブルを設計する上での良い考えを与えて、CLUSTERED INDEXの最適なクラスタリングキーが(UserID、SomeTypeID、SomeSubType)であると判断した場合は、現在持っているものをそのまま残しておくことをお勧めします。

それ以外の場合は、別のクラスタリングキーを決定した場合は、このように一意のノンクラスタードインデックスを追加できます。

1

プライマリキーで使用されているすべての列をフィルタリングする場合は、別々のインデックスを作成する必要はありません。あなたの主キーはあなたの例では大丈夫です。

列のうちの1つをフィルタリングする場合は、別のインデックスを作成することを検討してください。あなたのようにあなたの主キーを作成した場合はユーザーID = {0}

関連する問題