2015-10-05 63 views
0

我遇到了同事使用DATEADD和CAST時遇到的一些嚴重的性能問題的查詢。通過切換順序,他獲得了更好的性能。爲什麼訂單在性能方面很重要?按不同順序使用DATEADD和CAST時的性能差異

這where子句運行良好:

WHERE IHist.[DateTime] BETWEEN DATEADD(DD, -30,CAST(GETUTCDATE() AS Date)) AND DATEADD(DD, 1, CAST(GETUTCDATE() AS Date)) 

這where子句需要永遠:

WHERE IHist.[DateTime] BETWEEN CAST(DATEADD(DD, -30,GETUTCDATE()) AS DATE) AND CAST(DATEADD(DD, 1, GETUTCDATE()) AS DATE) 
+3

你只能猜測。請發佈執行計劃:)我懷疑它的索引在運行緩慢時未被使用。也許SQL Server不能很好地估計,並且必須將數據存儲在tempdb中...... –

回答

1

由於值是靜態的,最好是在開始

declare @d1 date, @d2 date 
select 
    @d1 = DATEADD(DD, -30, CAST(GETUTCDATE() AS Date)), 
    @d2 = DATEADD(DD, 1, CAST(GETUTCDATE() AS Date)) 
來定義它們

然後在WHERE子句中使用

+0

這就是我最終做的。這樣更有效率。謝謝! – Mike