我在表dbo.Employee的“ LastChangeDate”列上添加了索引。在以下两种情况下,SQL Server执行计划都将使用此索引吗?有人可以解释为什么或为什么不这样做。
SELECT EmployeeName
FROM dbo.Employee
WHERE DATEADD(MONTH, -2, LastChangeDate) >= ‘2016-01-01’
SELECT EmployeeName
FROM dbo.Employee
WHERE LastChangeDate >= ‘2016-01-01’
答案 0 :(得分:2)
第一个不能使用索引,因为LastChangeDate
是函数的参数。据我所知,SQL Server中唯一不允许索引的功能是转换为日期。
第二个可能使用也可能不使用索引。如果您在LastChangeDate
上有聚集索引,则应该。但是,查询大概不是非常有选择性-意味着它选择了所有行的很大一部分。在这种情况下,数据库优化器可能会决定放弃索引并进行全表扫描。
答案 1 :(得分:1)
当您像第一次选择那样将其用作功能时,您不能, 但是对于第二个选择是否使用了聚集索引,则可以(这就是为什么我要问您使用的索引类型...)