2009-08-13 7 views
3

私のデータベースに最適なインデックスを作成しようとすると、私が取り組んでいるいくつかの特定の動作に気づいたことがあります。ノンクラスタード・インデックスで使用できる主キーはありますか?

次の表と対応するインデックス(SQL Server 2005を)守ってください。この場合

CREATE TABLE demo 
(
id INT PRIMARY KEY IDENTITY, 
name NVARCHAR(50) NOT NULL, 
password BINARY(20) NOT NULL 
); 

CREATE NONCLUSTERED INDEX idx_demo_foo ON demo (name, password); 

、私は次のクエリを実行した場合...

SELECT id FROM demo 
WHERE name = @0 
AND password = @1; 

を...唯一の非クラスタ化インデックスシークが発生します。ノンクラスタード・インデックスにidを明示的に追加していないため、これは奇妙なものです。

+0

私が言及する必要があります...優秀な質問を。私はもっ​​と多くの人々がこのようなクエリプランを調査してほしいと思っています。 –

+1

厳密にするには、クラスタ化されたキーが含まれ、プライマリキーは含まれません。彼らは99.99%の時間に一致しますが、実際には区別できます。 PKは論理構造であり、クラスタ化されたキーは物理的なものです。 –

+0

物理的なもの(ユニークなインデックス)によって強制される '論理構造'は、PKも... –

答えて

0

NCIXは、クラスタ化インデックスキーを含める必要があります。.. where句の列は、インデックス内のカラム(時々同じ順序)。これは、主キーとは何の関係もありませんと同じである場合に発生しますそのため、システムはテーブル自体の基礎となる行に到達する方法を知っています。したがって、プライマリキーの背後にクラスタードインデックスがある場合(デフォルトではそれがそうです)、あなたは運がいいです。

もちろん、クラスタ化インデックスを変更したり、テーブルをヒープにすると、プライマリキーにアクセスするためのルックアップが必要になります。

編集:パスワードフィールドをインデックスキーから取り出し、それを含む列にすることをお勧めします。確かに、ユーザー名でエントリを調べてから、各ユーザー名に複数のパスワードを設定するのではなく、パスワードが一致するかどうかを確認するだけです。

create index ixBlah on demo (name) include (password); 

ロブ

6

クラスタ化インデックスキーは、常にノンクラスタードインデックスに含まれます。クラスタード・インデックス・キーは表の行ロケーターであり、索引行を表の行と照合するためには、すべての索引に行ロケーターが含まれていなければなりません。インデックスが正常に求める

+0

これは、ワイドクラスターキーがこのような大きな問題である理由です。クラスター化されていないすべてのインデックスでレプリケートされ、 *すべての非クラスタ化インデックスの*。 –

-1

+0

Ramesh - ここでの質問は、検索が必要かどうかに関するものです。シークやスキャンが行われたかどうかは関係ありません。 –

+0

私の悪い...間違った理解... – RameshVel

関連する問題