質問

当社のサイトはかなり激しくなりつつあるため、既存のクエリの最適化を検討しています。

これを調べている間、クラスター化インデックスの単純な参照がクエリ内にある場合、実行計画が約4〜5倍高速である複数のクエリに遭遇しました。たとえば、

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

SELECT ...
FROM myTable
WHERE categoryID =  @category 

次のクエリは、SSMSの実行計画に従って4倍高速になります。

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

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

役に立ちましたか?

解決

私にはかなり明白なようです

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

インデックスをカバーするSQL Serverをお読みください。 すべての仕組みを見る

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

編集

読み取り、lotID = @lotID NOT AND lotID = lotID

lotID> 0を実行することでクラスター化インデックスを偽造できる場合があります(あなたが持っている最小の番号を選択します)。シークを取得します

したがって、最小のlotID = 1で追加する場合 およびlotID> 0

スキャンの代わりにシークを確認することもできます。WHEREIndexValue>を示します。 ''この投稿インデックススキャンは、インデックススキャンよりも常に優れていますか?それとも高速ですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top