2015-04-24 67 views
2

如果我在where子句中使用某個函數,它會評估多少次?我想知道在更復雜的查詢中對性能的影響。在where子句中使用函數:函數評估了多少次?

例如:

select 
col1, col2, expirationDate 
from someTable 
where expirationDate > getdate() 

declare @today date = getdate() 
select 
col1, col2, expirationDate 
from someTable 
where expirationDate > @today 
+0

請考慮標記對此問題的答案。如果你需要更多的信息,可以繼續留言。 – paqogomez

回答

0

如果我沒有記錯,SQL Server將評估GETDATE()作爲確定性執行,並將評價GETDATE()一次,而不是每行。

編輯:我想我錯了 - GETDATE()總是非確定性的。 相反,GETDATE()在查詢中被視爲運行時常量函數。 Here是一篇文章解釋它。

3

It is only evaluated once.

FTA:

SQL Server有一個名爲其中一些表述被拉出樹和前行被​​提取執行「運行時常」的概念。結果被緩存並在查詢中的所有地方重新使用。 ... GETDATE()是一個

DBA

0

補充閱讀了作爲一個規則,你不應該包括你在一個函數的過濾列。

既然你沒有任何函數內封閉expirationDate色譜柱expirationDate的值接近在編譯時查詢優化器,因此(如果你有expirationDate指數即),它不會影響性能

對於example,如果expirationDate在一些函數中表示爲DATEPART,那麼即使編譯器存在,編譯器也不會選擇該列上的索引。

而且,如上所述,GETDATE()被視爲runtime constant function,其中表達式被從樹中拉出並在行被提取之前執行。然後將結果緩存並在查詢中的所有地方重新使用。