2009-06-08 10 views
4

私はSQL Server 2008を使用しています。私のテーブルの1つでは、識別子に(クラスタ化された)主キーを実装しました。ここではテーブルの記述があります:私の主キーがクエリを遅くするのはなぜですか?

識別子: - IdentifierId INT NOT NULL PK - 別名データ型はnvarchar(200) - NOT NULLのデータ型はint

は、私は2つのインデックス製:エイリアス用とデータ型の別のものを。 しかし、私は奇妙な何かに気づいた。次のクエリ実行している場合 :

SELECT * FROM IDENTIFIER WHERE DataType = 1 

をクエリでは、実際にそれらなしでよりインデックスおよび主キーで実行速度が遅いです。それは約10秒かかる!インデックスは断片化されていません - 私はチェックしました - 私はこれも使用しています。これはクエリ自体の前にこの

GO 
CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO 
DBCC FREEPROCCACHE; 
GO 

です。

この表はかなり大きく、数百万のエントリがあります。インデックスとPKはほとんどのクエリで重要な役割を果たしますが、この場合クエリが実行されている理由を理解できません遅い何か案は?事前に

おかげ

EDIT:実行計画が唯一のクラスタ化インデックスが使用されていることを示しており、データ型の変数は、現在150

+0

作成された実行計画を見ましたか? –

+0

データタイプの列はどのように選択されますか? (つまり、列の値はいくつありますか?) –

+0

ちょうど答え:クラスタ化されたインデックスとデータ型だけが1から150になる –

答えて

5

に上がるには、複合非クラスタでDataTypeにインデックスを覆っを作成します。コラムAliasを含めて、AliasDataType列に個々のインデックスを削除します。

CREATE NONCLUSTERED INDEX NC_DataType_I_Alias 
    ON tblIdentifier(DataType) INCLUDE (Alias) 
7

あなたは*を選択し、システムがまだ電子を取得する必要があります非常に列。したがって、オプティマイザは、クラスタ化インデックススキャンを使用するほうが速いことを頻繁に判断します(クラスタ化インデックスは実際にはインデックスではなく、指定された順番で整理されたデータです)、ブックマークルックアップ主キーに基づいて追加の行を取得します。

ので、性能の鍵となるのは、それがcoveringとなるように、非クラスタ化インデックス(非クラスタ化インデックスは、多くの場合、はるかにクラスタ化インデックスをアウトパフォームするので、これは、本当に、悪い名前です)とインデックス内のINCLUDE追加の列を持つことです。 SQL Server 2005以前の場合は、インデックスの最後に列を追加するだけです。

基本的にプライマリキーは良好ですが、クラスタリングの選択を必ずしも決定する必要はありません。ほとんどの選択操作でパフォーマンスを得るには、非クラスタ化インデックス(適切にINCLUDE ed列)を使用する必要があります。最も選択的ではなく最も一般的にソートされたケースのためにクラスター化インデックスが設計されています。

+0

+1良い説明のために –

+0

が同意した、+1も –

関連する問題