首頁 > 資料庫 > mysql教程 > 為什麼在 WHERE 子句中使用日期時間運算式時 My SQL Server 2008 查詢速度很慢?

為什麼在 WHERE 子句中使用日期時間運算式時 My SQL Server 2008 查詢速度很慢?

Barbara Streisand
發布: 2024-12-18 17:03:13
原創
895 人瀏覽過

Why is My SQL Server 2008 Query Slow When Using DateTime Expressions in the WHERE Clause?

與DateTime 表達式的查詢效能差異

與字串文字值相比,在WHERE 子句中使用日期表達式時,查詢會出現明顯的速度下降,從而導致查詢效能陷入困境。讓我們更深入地研究這個問題並尋求解決方案。

根本原因

效能差距的產生是由於 SQL Server 2008 中的一個錯誤,該錯誤會影響在日期表達式中使用日期表達式時的基數估計。 WHERE 子句。該錯誤會導致匹配行數的估計不正確。

最佳化查詢

為了規避此錯誤,建議使用以下最佳化查詢:

Where FK.DT = cast(getdate() + 1 - datepart(day, getdate()) as date)
登入後複製

此表達式傳回當月的開始時間,這可能是此場景中所需的選擇標準。

追蹤標誌4199

或者,可以啟用追蹤標誌 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板