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 都是按降序排列的。但是,当我运行查询时,实际执行计划仍然对 Index1 而不是 Index2 进行了索引扫描。鉴于 DateTime 条件,我会认为 Index2 会是更好的选择,并且会导致索引搜索。但那并没有发生。

在调查为什么会发生这种情况时,我遇到了这篇 MS 文章,现在我想知道是否需要像文章中提到的那样创建具有日期时间的索引。当我在 Google 上搜索时,我没有发现其他任何地方都提到过这种使用日期时间创建索引的技术,因此想知道其他人在做什么?

4

1 回答 1

2

确切的索引定义是什么?索引(City, Category, CreatedOn, CutOffDate, Type, Visibility)不能用于您的查询。事实上,假设您有一个标准,该标准>在两个字段上使用不等式比较 ( ) 并在它们之间使用 OR 条件,因此没有索引可能有助于比较的日期时间部分。您链接的文章与您的问题绝对无关。

为了让我们提出一个好的索引,您必须准确地告诉我们表的定义、您使用的准确查询以及每列中的基数(不同值的数量)。

于 2012-04-05T21:49:03.083 回答