2012-04-05 30 views
1

我正在优化在我们的系统上非常频繁地使用的查询。 where子句类似于使用DateTime列创建非聚集索引作为键

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) 

已经是NC指数(指数1)与市,类型,可见,IsActive,存在请将isDeleted。我使用上面的字段创建了一个新的NC索引,但在开始时也添加了CreatedOn,CutOffDate和Category。

因此,新索引(索引2)上的键是城市,类别,CreatedOn,CutOffDate,类型,可见性等。CreatedOn和CutOffDate都是以降序排列。但是,当我运行查询时,实际的执行计划仍然对索引1进行索引扫描,而不是索引2。鉴于日期时间条件,我会认为Index2将是更好的选择,并会导致索引搜索。但是那没有发生。

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

回答

2

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

对于我们提出一个好的索引,你必须准确地告诉我们表的定义,你使用的确切查询和每列中的基数(不同值的数量)。

+0

那么这就解释了为什么Index1选择的是Index2而我却是在嗅探错误的线索。但是,删除其中一个字段和OR条件有助于使用日期时间索引? where子句的条件根据用户在应用中做出的选择而有所不同。我真的不能在这里提供所有的细节。然而,表中有超过250,000行,并且CreatedOn> Date导致大约40,000行,这就是为什么我想使用具有CreatedOn的索引。此外,http://stackoverflow.com/questions/10028225/which-where-condition-on-datetime-will-be-faster是我为此所做的变化 – shashi 2012-04-05 22:14:55

+0

此外,(20,30,40)中的类别是否符合与OR条件的平等比较使用具有Category的索引? – shashi 2012-04-05 22:18:26

+0

单个列*上的不等式比较*可能受益于索引。但是,由于索引[引爆点](http://www.sqlskills.com/BLOGS/KIMBERLY/category/The-Tipping-Point.aspx),这是一条危险的道路。大多数时间序列类型的数据使用时间值(例如'CreatedOn')作为聚簇索引的最左边的键,因为绝大多数查询请求来自特定时间*间隔*的数据(即[范围扫描]( http://msdn.microsoft.com/en-us/library/ms177426.aspx)) – 2012-04-05 22:54:10