Sql-Server

SQL Server 是否為每一行計算一次函式?

  • July 15, 2021

我有一個這樣的查詢:

SELECT col1
FROM   MyTable
WHERE  
   DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 
      BETWEEN col2 
      AND     col3
;

這給出了一個關於執行計劃的工具提示,類似於:

執行工具提示

是否dateadd為查詢中的每一行執行搜尋謂詞部分?或者 SQL Server 是否為整個查詢計算一次值?

某些已知為執行時常量的函式會經歷稱為常量折疊的過程。當“折疊”一個常量時,表達式在查詢執行的早期被評估,結果被記憶體,並在需要時使用記憶體的結果。查詢中的表達式DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))是 AFAIK,一個執行時常量,因此每個查詢只會折疊和評估一次。

瑣事:RAND()人們期望可展開的功能實際上是可折疊的,這導致了一些意想不到的行為。但是其他的,例如NEWID(),不可折疊,並且會強制每行進行評估。

引用自:https://dba.stackexchange.com/questions/18459