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()
,不可折叠,并且会强制每行进行评估。