2012-04-04 4 views
3

一般的な顧客テーブルがあります。検索フィールドのTSQLインデックス(Idを含める必要があります)

Id Int Identity Primary Key, 
FirstName varchar(255), 
LastName varchar(255), 
Phone VarChar(30) 

したがって、プライマリキーはIDにクラスタ化一意インデックスを作成します。

検索を高速化するために、名前フィールドにインデックスを追加します。

私の質問は、これらのインデックスにIDを追加する必要があるかどうか、またはそれらのインデックスがプライマリキーに関連付けられるかどうかです。

たとえば、

Create Index IX_Customer_FirstLastName On Customers(FirstName, LastName, Id) 

...それは過剰ですか?

以下は、それほど効率的かどうかですか?

Create Index IX_Customer_FirstLastName On Customers(FirstName, LastName) 

TIA

+0

何を検索しますか?常にフル姓/姓、または個別に...または? –

+0

それは本当に一般的な質問の多くです。テーブルの他のインデックスにプライマリキーフィールドを持たせるとどんな利点がありますか? –

+0

一般的に、@MichaelFredricksonの答えはそれをかなりカバーしています。 –

答えて

2

それはあなたの他のインデックスにIDを追加しても意味がありません。あなたは同じfirstNamelastName組み合わせで多数の行を持っていた場合にのみ役立つだろう、とあなたはすでにID ...

を知っていたしかし、あなたはすでにあなたが探しているレコードのIDを知っていたならば、あなたクラスタ化インデックスを使用して検索するだけで済みます。

また、クラスタ化されていないインデックスにはすでにクラスタ化インデックスの値が含まれているため、クラスタ化されていないインデックスを使用して検索された後でクラスタ化インデックスを使用してその行をルックアップできます。 You wouldn't have to include ID in your non-clustered index if you wanted to make it a covering index for the fields (FirstName, LastName, Id)

最後の注意あなたがFirstNameLastNameを使用して単一のインデックスを作成する場合は、このインデックスは唯一FirstName、あなたのインデックスのリーディングエッジを含む検索に使用されます。 LastNameまたは単にFirstNameを使用して検索を実行する場合は、各列に1つずつ、2つのインデックスを作成します。

+0

マイケルに感謝します。クラスタ化されていないインデックスがクラスタ化インデックスを指しているという事実が私の質問に答えます。 もし私がしたら、私はちょっとこの質問を少し広げたいと思います。 主キーがUniqueIdentifierの場合は、パフォーマンス上の理由からクラスタ化されません。その後のインデックスからIDを離れることをお勧めしますか? –

+0

私はまだインデックスの 'ID'部分を作成しませんでした。あなたが[INCLUDE'](http://msdn.microsoft.com/en-us/library/ms188783.aspx)のIDを順番にインデックスをカバーするためには正当な理由があるかもしれませんが、私はそのケースはおそらくそうではないと想定しており、その理由のためにIDを含める必要はないでしょう。しかし、あなたのPKを一意の識別子にすることをお勧めします。[GUIDを持つ非クラスタ化インデックスを使用しても断片化が多く発生するためです](http://www.sqlskills.com/BLOGS/PAUL/ポスト/クラスタ化またはノンクラスタード・インデックス・オン・ランダム・GUID.aspx)。 –

+0

ありがとうMichael、 1つのプロジェクトでUniqueIdentifierを選択することはできません。 少なくともクラスター化されたインデックスをクラスター化されていないものに変換しました。 –

関連する問題