2011-12-06 2 views
1

私は、演算子がより小さいか大きいかでクエリを実行すると、SQL Serverのインデックスが正しく動作しないことがわかりました。SQL Serverのインデックスのオペレータの問題より小さい

SELECT *のTestTable FROM WHERE ICOUNT = 10:私はこれでテーブルを照会、今

Column Name, column type, primary Key, index 
iID,   int,   yes,   cluster index 
iCount,  int,   no,   non-cluster index 
name,  nvarchar(255), no,  no index 

は、私はこのようなだけで2列に単純なテーブル(のTestTableを)持っていると言います

非常に良いですが、Sqlサーバーは、列iCountの非クラスタインデックスを使用して結果を取得します。

しかし、私はこれでテーブルを照会場合:

SELECT *のTestTable FROM WHERE ICOUNT < 10、

IIDのためのクラスタ索引にオーバーインデックス・スキャンを行います

SQL Serverの結果を取得します。

クエリで演算子がより小さいかより大きい場合、SQL Serverが適切なインデックスを使用できないのはなぜかと思います。

+0

クラスター化されたインデックスを、化合物 '(iCount、iID)' **にその順序で変更することを検討してください**。 – onedaywhen

+0

または、主キーの性質を変更する必要がないiCountの非クラスタ化インデックスに「名前」をインクルード列として追加できます。 – hatchet

答えて

4

テーブルの行数が非常に少ない場合は、非クラスタ化インデックスを使用せずにクラスタ化インデックスの残りの列を参照するのではなく、SQL Serverがクラスタ化インデックスをスキャンするほうが安いです。その場合は、クエリをSELECT iCount FROM ...に変更すると、期待どおりにインデックスを使用するようにクエリプランが変更されるはずです。

関連する問題