Sql-Server
SQL Server 是否為每一行計算一次函式?
我有一個這樣的查詢:
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()
,不可折疊,並且會強制每行進行評估。