Sql-Server
SQL Server 探查器中 CPU 時間和讀取的差異
我的生產數據庫伺服器(即 SQL Server 2016)性能下降,我使用分析器保存了長時間執行的查詢,如下圖所示:
CPU 時間 = 65141,讀取次數 = 36474959,持續時間 = 114546
我已經保存了跟踪文件並稍後打開,所以我不確定持續時間是毫秒還是微秒。
但是,現在當我在工作時間之外在 prod 上執行相同的查詢時,查詢執行速度很快,並且“設置統計資訊 IO”顯示只有很少的數據頁被讀取,我的假設是 CPU 時間和查詢的讀取應該是恆定的儘管持續時間長,查詢的執行時間,有什麼想法嗎?我是否應該根據數字認為此查詢效率低下?
@DanGuzman 正確地向您指出了Sommarskog 的優秀文章,您應該閱讀該文章。
- 然後,如果以下簡單步驟不起作用,請嘗試查看計劃記憶體並查看其中的內容。或者使用查詢儲存(因為您使用的是 SQL 2016)來查看有多少不同的執行計劃。
您正在將 SET STATISTICS(任何東西)與 Profiler 進行比較。不要那樣做。它不起作用。Profiler 和擴展事件擷取相對準確的數字。SET STATISTICS (anything) 沒有 - 作為一個例子,它沒有擷取函式成本!
您正在嘗試匹配在不同時間完成的計劃,可能使用不同的統計數據。不要那麼做。
繼續更新可疑查詢中涉及的所有表的統計資訊,最好使用 FULLSCAN,在“自己執行”測試之前查看是否會改變行為。
查看查詢本身。
- 是否涉及參數嗅探?
- 一旦合理格式化,是否有數千行長的行,有幾十個連接,通常是同一個表?如果是這樣,請不要讓 Entity Framework 嘗試自行創建複雜的 SQL 語句。它做得很糟糕。