使用DateTime列作为键创建非聚簇索引

时间:2012-04-05 21:26:27

标签: sql-server sql-server-2005 indexing

我正在努力优化在我们的系统上经常使用的查询。 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等.FredatedOn和CutOffDate都是降序。但是,当我运行查询时,实际执行计划仍然执行Index1的索引扫描而不是Index2。鉴于DateTime条件,我认为Index2将是更好的选择,并将导致Index seek。但那并没有发生。

在调查为什么会发生这种情况时,我遇到了this MS article,现在我想知道是否需要像文章中提到的那样创建具有日期时间的索引。当我在Google上搜索时,我没有找到这种创建带有日期时间的索引的技术,因此想知道别人做了什么?

1 个答案:

答案 0 :(得分:2)

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

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