4

私たちのサイトはかなりの打撃を受けているため、既存のクエリのいくつかを最適化することを検討しています。

これを調べていると、クラスター化されたインデックスの単純な参照がクエリに含まれている場合、実行プランが約 4 ~ 5 倍高速であるいくつかのクエリに出くわしました...たとえば

これが古いクエリの場合:

SELECT ...
FROM myTable
WHERE categoryID =  @category 

SSMS の実行計画によると、次のクエリは 4 倍高速になります。

SELECT ...
FROM myTable
WHERE categoryID =  @category 
AND lotID = lotID

これがどのようにクエリを高速化するのか理解できないようです。クラスター化されたインデックスはlotIDにありますが、それ自体と比較しているため、これはどのように役立ちますか?

4

1 に答える 1

6

私にはかなり明白に思えます

最初のクエリはクラスター化インデックスの対象ではありませんが、2 番目のクエリは最初のクエリの WHERE 句に lotID がないためです。

SQL Server カバー インデックスを読んで、すべてがどのように機能するかを確認することをお勧めします。

また、クラスター化インデックスはデータであり、テーブルのすべてのデータはクラスター化インデックスにあることを理解する必要があります。クラスター化インデックスを持つテーブルに非クラスター化インデックスを作成すると、非クラスター化インデックスによってクエリを完全に満たすことができない限り、非クラスター化インデックスはクラスター化インデックスへのポインターを持ちます (残りのデータはそこにあるため)。その場合、クラスター化されていないインデックスのみが使用されます...私は今、とりとめのないことをやめます

編集

AND lotID = @lotID NOT AND lotID = lotID を読みました

where lotID >0 (持っている最小の数字を選択) を実行することで、クラスター化されたインデックスを偽装できる場合があり、シークが発生します。

したがって、最小のロット ID = 1 で AND ロット ID > 0 を追加した場合

スキャンの代わりにシークを見ることもできます。この投稿で WHERE IndexValue > '' を示します。

于 2009-06-16T18:43:17.737 に答える