與字串文字值相比,在WHERE 子句中使用日期表達式時,查詢會出現明顯的速度下降,從而導致查詢效能陷入困境。讓我們更深入地研究這個問題並尋求解決方案。
效能差距的產生是由於 SQL Server 2008 中的一個錯誤,該錯誤會影響在日期表達式中使用日期表達式時的基數估計。 WHERE 子句。該錯誤會導致匹配行數的估計不正確。
為了規避此錯誤,建議使用以下最佳化查詢:
Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
此表達式傳回當月的開始時間,這可能是此場景中所需的選擇標準。
或者,可以啟用追蹤標誌 4199 以強制進行準確的基數估計。當開啟追蹤標誌4199 時,以下查詢也會產生所需的計畫:
Where FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) as DATE) OPTION (QUERYTRACEON 4199)
例如,名為FK 的表包含名為DT 的列,其值表示開始每個月的以下兩個查詢展示了效能差異:
-- Slow due to incorrect cardinality estimates SELECT COUNT(Filler) FROM FK WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE) -- Fast due to accurate cardinality estimates with trace flag 4199 SELECT COUNT(Filler) FROM FK WHERE FK.DT = CAST(DATEADD(m, DATEDIFF(m, 0, getdate()), 0) AS DATE) OPTION (QUERYTRACEON 4199)
啟用追蹤標誌4199,由於最佳化的查詢計劃,第二個查詢將顯著加快執行時間。
以上是為什麼在 WHERE 子句中使用日期時間運算式時 My SQL Server 2008 查詢速度很慢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!