我使用SQL Server 2008中我有一個標量函數來抓住一個客戶端和輸出日期時間爲客戶端時區的時區。我在存儲過程的select語句中使用它。我注意到,使用函數或不使函數在性能上產生巨大差異,我嘗試檢查執行計劃並使用「統計時間,IO on」來運行存儲過程,以檢查是否有所作爲。標值功能選擇進行性能上的巨大差異
例如,這是調整時區查詢:
Declare @ClientID int
Select @ClientID = 123
select
abt.someID, myDB..adjustTimeZone(@ClientID, abt.dtDate)
from
aBigTable as abt
where
abt.dtDate > '2016-08-01'
and abt.dtDate < '2016-08-30'
上面的代碼將返回約16K的記錄,並需要16秒才能完成。
我克隆記錄到九月公正,以確保它不會因爲任何緩存,然後我用另一種方式來調整時區,像下面的查詢:
Declare @ClientID int, @ZoneHourChange int
select @ClientID = 123
select @ZoneHourChange = (select hourOffSet from Client
where ClientID = @ClientID)
select
abt.someID, DateADD(hour, @ZoneHourChange, abt.dtDate)
from
aBigTable as abt
where
abt.dtDate > '2016-09-01'
and abt.dtDate < '2016-09-30'
上面的代碼返回16K記錄也,但只需要一半的時間。從執行計劃中我可以看到,成本是一樣的,並沒有涉及到平行性。什麼導致了巨大的差異?先謝謝你。
一個進行查找每一行..其他不 – JamieD77
你的意思是,該功能將在查找客戶端表的每一行的時區信息? – Jaaaaaaay
是.. http://www.databasejournal.com/features/mssql/article.php/3845381/T-SQL-Best-Practices-150-Don146t-Use-Scalar-Value-Functions-in-Column-List-或-WEERE-Clauses.htm – JamieD77