@date 和 getdate() 之间的性能有区别吗?

ado*_*lot 6 performance sql-server-2008 sql-server query-performance

通常我getdate()在我的 where 子句中使用函数来回到过去。就像是:

 DOC.DATUM >= DATEADD(DD,-1*SSN_SDO.DANA_ZA_POVRAT,GETDATE()) 
Run Code Online (Sandbox Code Playgroud)

如果我首先声明一个日期参数并在查询中使用它,SQL Server 2008R2 会执行更快的查询吗?

declare @dateNow date = getdate()
...
where
     DOC.DATUM >= DATEADD(DD,-1*SSN_SDO.DANA_ZA_POVRAT,@dateNow ) 
Run Code Online (Sandbox Code Playgroud)

Roi*_*ish 5

答案是 - 您必须对其进行测试才能找到答案。
我在一个有大约 8,000,000 行的表上做了我自己的测试

DECLARE @date DATETIME
SET @date = GETDATE()
;
SELECT T.DateCol, DATEADD(dd,-100,@date)
FROM dbo.TableName AS T
WHERE T.DateCol > DATEADD(dd,-100,@date)
;
SELECT T.DateCol, DATEADD(dd,-100,GETDATE())
FROM dbo.TableName AS T
WHERE T.DateCol > DATEADD(dd,-100,GETDATE())
;
Run Code Online (Sandbox Code Playgroud)

在我的例子中,变量的使用导致 SQL Server 估计了一个昂贵的计划:

在此处输入图片说明
原因是SQL Server在编译时建立查询计划
,当时变量的值还不知道,SQL Server不能使用统计信息。
我建议你阅读参数化

在其他情况下,使用变量的成本会低于多次调用函数的成本,
所以这里又是 - TEST TEST 和 TEST :)

  • `GETDATE` 是一个 [运行时常量](http://blogs.msdn.com/b/conor_cunningham_msft/archive/2010/04/23/conor-vs-runtime-constant-functions.aspx),实际上不会叫了很多次。在 OP 的情况下,因为他们使用与列引用混合的表达式,我不确定它实际上会影响基数估计。 (2认同)