日期運算式查詢:使用字串文字更快
在條件內使用日期運算式的查詢(如以下範例所示)通常表現緩慢SQL Server 2008中的效能:
Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE)
但是,據觀察,取代帶有字串文字的日期表達式(例如「2013-05-01」)會顯著加快查詢執行速度。這種差異讓許多開發人員感到困惑。
效能差異是由 SQL Server 2008 中的一個內部錯誤引起的,該錯誤影響了使用日期表達式時估計結果基數的方式。當出現像問題中的日期表達式時,SQL Server 錯誤地認為它表示與指定月份的第一個日期相對應的常數值。這會導致基數估計不準確,從而導致查詢計劃效率低下。
另一方面,使用字串文字作為日期值會迫使 SQL Server 在執行時面對實際值並得出更精確的基數估計。這允許優化器產生更優化的查詢計劃,從而加快執行速度。
要繞過此錯誤,可以使用以下替代表達式:
Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
此表達式傳回一個常數表示當月第一天的日期值,這與查詢的預期行為一致。透過這種替換,優化器可以準確估計基數並產生更有效率的查詢計劃,解決與日期表達式相關的效能瓶頸。
以上是為什麼 SQL Server 2008 日期運算式查詢比字串文字查詢慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!