Date列上的索引 - 使用Between / And或Greater / Less

时间:2017-06-07 13:28:50

标签: sql-server tsql sql-server-2012

我在接受采访时被问到这个问题。 AdventurWorks2012.Sales.CreditCard表。首先,我在ModifiedDate列上创建了一个非聚集索引来模拟面试问题。我需要查找记录,让我们说2007年7月

SELECT cc.CreditCardID, cc.ModifiedDate
FROM sales.CreditCard cc
WHERE cc.ModifiedDate >= '07/01/2007' OR cc.ModifiedDate < '08/01/2007'
------------
SELECT cc.CreditCardID, cc.ModifiedDate
FROM sales.CreditCard cc
WHERE cc.ModifiedDate BETWEEN '07/01/2007' AND  '07/31/2007'
------------
SELECT cc.CreditCardID,  cc.ModifiedDate
FROM sales.CreditCard cc
WHERE Year(cc.ModifiedDate) = 2007 AND month(cc.ModifiedDate) = 7

以下是执行计划。 1)我不知道为什么Between是最快的查询和唯一使用NCIndex的查询,而我被告知标准SQL(第一个查询)将是最快的。 2)他们说,避免在where子句中使用函数,但是,它在第​​一个查询中显示的结果与我不使用函数的结果相同。

enter image description here

1 个答案:

答案 0 :(得分:0)

如评论中所述。第一个where子句where子句错误地使用OR而不是AND,并使该语句返回所有行,这些行将比行的子集慢。