我正在优化一些查询并遇到了一个奇怪的问题,我不知道该如何解释。使用SQL Server 2012与下面的代码:TSQL:静态变量与where子句中的计算
DECLARE @startdate DATETIME2 = DATEADD(day,-1,GETDATE()),
@enddate DATETIME2 = GETDATE()
SELECT *
FROM table1 WITH(NOLOCK)
WHERE somedate BETWEEN DATEADD(day,-1,GETDATE()) AND GETDATE()
AND somestate = 'NV'
SELECT *
FROM table1 WITH(NOLOCK)
WHERE somedate BETWEEN @startdate AND @enddate
AND somestate = 'NV'
望着实际执行计划,第一选择有一个索引查找和键查找,其中,第二有一个聚集索引扫描。由于SELECT
与功能性用途基本相同,因此我不确定为什么执行计划中存在差异。我最后一位DBA告诉我说,在WHERE
条款中声明带有值的变量要比使用WHERE
条款中的计算要好,但这似乎与该声明相反。我希望澄清是什么原因造成这两个陈述之间的巨大差距。我确实试图寻找一些关于这方面的答案,但没有太多的运气,如果有人能指出我正确的方向,我会非常感激。
谢谢!
设置[坏习惯踢 - 把NOLOCK无处不在](http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - 它是*不推荐*到处使用 - 相当相反! –
我猜在第二种情况下,sql服务器不知道startdate和enddate是相关的,他期望任何值,所以他选择扫描(相隔日期)。 –