在一本关于 SQL Server 2014 的书中,建议我避免
SELECT orderid, orderdate, filler
FROM dbo.Orders
WHERE YEAR(orderdate) = 2014;
并且更喜欢
SELECT orderid, orderdate, filler
FROM dbo.Orders
WHERE orderdate >= '20140101'
AND orderdate < '20150101';
当存在聚集索引时,orderdate
因为使用YEAR
会使查询不可SARGable。
自 SQL Server 2014 以来,这种情况有变化吗?如果是这样,它是在哪个版本中更改的?
是的 - 它仍然不可控制(2022 Fiddle)。
Connect 站点上的几个相关请求(回程机器链接)是
但这些迄今为止从未实施过。
YEAR
对第二个(特别提到)的回应是对我来说,这似乎确实是可以在 SQL Server 2016“它只是运行得更快”标语下考虑的事情,但大概事实并非如此!
新
DATETRUNC
函数也不可控制,但至少理解在应用于DATETRUNC
列时将保留该列的顺序 - 因此可以避免在按年份分组时进行不必要的排序。如果要实现这一点,我认为可以通过使用动态查找机制
CAST
以与to的可控制性类似的方式来完成。DATE
即使在这种情况下,直接将其表达为
>= ... <
范围仍然比仅仅依靠动态查找来对其进行排序更有效。