我在接受采访时被问到这个问题。 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子句中使用函数,但是,它在第一个查询中显示的结果与我不使用函数的结果相同。
答案 0 :(得分:0)
如评论中所述。第一个where子句where子句错误地使用OR而不是AND,并使该语句返回所有行,这些行将比行的子集慢。