SQL Server 是否为每一行评估一次函数?

Stu*_*ler 11 sql-server-2008 sql-server optimization sql-server-2008-r2

我有一个这样的查询:

SELECT col1
FROM   MyTable
WHERE  
    DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 
       BETWEEN col2 
       AND     col3
;
Run Code Online (Sandbox Code Playgroud)

这给出了与此类似的执行计划的工具提示:

执行工具提示

dateadd搜索谓词的一部分是否对查询中的每一行执行?或者 SQL Server 是否为整个查询计算一次值?

Rem*_*anu 15

某些已知为运行时常量的函数会经历称为常量折叠的过程。当“折叠”一个常量时,在查询执行的早期评估一个表达式,结果被缓存,并在需要时使用缓存的结果。查询中的表达式DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))是 AFAIK,一个运行时常量,因此每个查询只会折叠和评估一次。

琐事:RAND()人们期望可展开的功能实际上是可折叠的,这会导致一些意想不到的行为。但是其他的,例如NEWID(),不可折叠,并且会强制每行进行评估。

  • @StuartBlackler - [这里有一个演示](https://gist.github.com/2822774) SQL Server 如何折叠像 `GETDATE()` 这样的函数。 (2认同)