2011-03-16 3 views
29

は、goodまたはdoesn't matterまたはbadです。カバーインデックスにプライマリキーを含めますか?いいえ/重要ではない/主キーをカバーインデックスに含めることはできませんか?

CREATE NONCLUSTERED INDEX index_name_here ON dbo.table_name_here 
(column_to_index_here) 
INCLUDE (primary_key_column,other_column_here) 
WITH(STATISTICS_NORECOMPUTE=OFF, IGNORE_DUP_KEY=OFF, --<default junk from SSMS 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 

私はそれが問題ではないと思っています。なぜなら、PKはインデックスにあるからです。

EDIT - 明確にする。
私のprimary_key_columnはクラスタ化されていますが、そうでないときにも情報を説明することができます。

column_to_index_here欄のdbo.table_name_hereに参加し、primary_key_columnother_column_hereの他のテーブルに参加します。

+0

クラスタ化インデックスとは何ですか。 –

答えて

36

PKでクラスタリングしている場合、は、とは関係ありません。クラスタ化されていないすべてのインデックスには、その行のクラスタードインデックスキーがその定義の一部として含まれているため、SQL Serverはこれを無視します。

インデックスに余分なスペースは使用されませんが、定義に含めるのは冗長です。

クラスタ化インデックスにPKが含まれていない場合は、インデックスを使用する同じクエリの一部としてそのフィールドを取得する必要がある場合にのみ、そのフィールドを含めます。

INCLUDEインデックス内のフィールドは、非リーフノードにはないため、インデックスはその値でソートされません。

+1

+1を追加するだけです。 OPのNCIは一意ではないため、NCIのキーには「包含」列として扱われるだけでなく、追加されます。 'NCI'が一意であると宣言されていれば、リーフページに表示されます。 –

+0

@マーティン - ありがとう、私はそれを知らなかった。私はそれが行の参照値としてのみ葉レベルであると仮定しました。 – JNK

+2

参照用リンクhttp://sqlblog.com/blogs/kalen_delaney/archive/2010/03/07/more-about-nonclustered-index-keys.aspx –

-3

実際にクエリを「カバーする」必要がある場合にのみ含めるようにしてください。そうしないと、スペースを無駄にしてしまいます。カバリング・インデックスの全体的なポイントは、ベース・テーブルでのブックマーク・ルックアップの必要性を排除することです。そのため、主キーの使用はありません。

2

PKはインデックス にあるためです。

PKがその文で別のインデックスにあることを意味すると仮定すると、主キーをこのインデックスに含めるかどうかは、クエリで選択するかどうかによって異なります。あなたがそれを選択しようとしている場合は、それをインデックスに含めてください。そうでない場合は、それを放置してください。また、PKでクラスタ化されたテーブルの場合は、@ JNK answerを参照してください。

関連する問題