システムで頻繁に使用されるクエリの最適化に取り組んでいます。where句は次のようになります
WHERE J.Visibility > 11
and J.isactive='true'
and J.isdeleted='false'
AND (
CutOffDate > '2012-04-05 00:00:00.000'
OR J.CreatedOn > '2011-10-08 00:00:00.000'
)
AND J.Country = 'India'
AND J.City='Bangalore'
AND (J.Type > 0 AND J.Type < 230)
AND J.Category in (20)
City、Type、Visibility、IsActive、IsDeleted の NC インデックス (Index1) が既に存在します。上記のフィールドを使用して新しい NC インデックスを作成しましたが、最初に CreatedOn、CutOffDate、Category も追加しました。
したがって、新しいインデックス (Index2) のキーは、City、Category、CreatedOn、CutOffDate、Type、Visibility などでした。CreatedOn と CutOffDate は両方とも降順でした。ただし、クエリを実行すると、実際の実行プランは依然として Index2 ではなく Index1 の Index Scan を実行していました。DateTime 条件を考えると、Index2 の方が適切な選択であり、Index シークが発生すると考えていました。しかし、そうはなりませんでした。
なぜこれが起こっているのかを調査しているときに、この MS の記事に出くわしました。記事に記載されているように、datetime のインデックスを作成する必要があるかどうか疑問に思っています。Google で検索したときに、datetime を使用してインデックスを作成するこの手法が他に見つからなかったので、他の人は何をしているのでしょうか?