在阅读调优TSQL
查询时,我看到了关于避免(或小心)WHERE
子句中的函数的建议。然而,在某些情况下——比如需要从今天开始的动态日期的搜索——我很好奇查询是否可以进一步调整?例如,下面的查询使用DATEADD
当前日期的功能,它允许用户随时获取过去三十天的正确信息:
SELECT *
FROM Zoo..Transportation
WHERE ArrivalDate BETWEEN DATEADD(DD,-30,GETDATE()) AND GETDATE()
如果我尝试消除该函数,DATEADD
我可以声明一个变量,该变量将提取该时间,然后使用存储在变量中的设置值查询数据,例如:
DECLARE @begin DATE
SET @begin = DATEADD(DD,-30,GETDATE())
SELECT *
FROM Zoo..Transportation
WHERE ArrivalDate BETWEEN @begin AND GETDATE()
但是,执行计划和统计数据显示完全相同的读取次数、扫描次数和批处理成本。
在这些动态数据的实例中(例如,使用今天的日期作为起点),我们如何减少或消除WHERE
子句中函数的使用?