1

システムで頻繁に使用されるクエリの最適化に取り組んでいます。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 を使用してインデックスを作成するこの手法が他に見つからなかったので、他の人は何をしているのでしょうか?

4

1 に答える 1

2

正確なインデックスの定義は何ですか? のインデックスは(City, Category, CreatedOn, CutOffDate, Type, Visibility)クエリに使用できません。実際、>2 つのフィールドで不等比較 ( ) を使用し、それらの間に OR 条件を使用する基準がある場合、比較の日時部分に役立つ可能性のあるインデックスはありません。リンクする記事は、問題とはまったく関係ありません。

適切なインデックスを提案するには、テーブルの定義、使用する正確なクエリ、および各列のカーディナリティ (個別の値の数) を正確に伝える必要があります。

于 2012-04-05T21:49:03.083 に答える