標籤:管理器 blog col end iis div 任務 結果 查詢語句
前述
最近一個項目CPU佔用非常高,在IIS內設定CPU限制後系統頻繁掉線,通過工作管理員發現SQLSever資料庫佔用CPU達到40%--70%,對於資料庫本人也就處在增刪查改幾個操作水平層面,這次出了問題就硬著頭皮上了,好在經過各種百度問題最終解決了,記性不好用的也不多,為防止忘掉就把主要排查方法記錄下來。
尋找耗時語句
SELECT TOP 10 total_worker_time/execution_count AS avg_cpu_cost, plan_handle, execution_count, (SELECT SUBSTRING(text, statement_start_offset/2 + 1, (CASE WHEN statement_end_offset = -1 THEN LEN(CONVERT(nvarchar(max), text)) * 2 ELSE statement_end_offset END - statement_start_offset)/2) FROM sys.dm_exec_sql_text(sql_handle)) AS query_textFROM sys.dm_exec_query_statsORDER BY [avg_cpu_cost] DESC
直接複製粘貼上面的語句就可以查出最耗時的前10條語句。
查看具體語句執行時間
切換到文字模式
使用下面的語句查看單條語句的執行時間
go set statistics profile on set statistics io on set statistics time on go /** 欲查詢CPU執行時間的目標語句**/ go set statistics profile off set statistics io off set statistics time off go
語句耗時的原因及對策
1.單表資料太多:分表、清理過時資料
排查中有兩張相同的表,一張表資料量在7000條,另一張表由於問題插入大量無用資料達到三十萬+,相同的語句針對兩張表的查詢時間分別為0ms/900ms,差距非常大。
表1執行時間 表2執行時間
2.資料表沒有索引:建立叢集索引
對錶結構進行分析,發現沒有建立叢集索引,於是針對錶及主要操作欄位建立叢集索引,建立叢集索引後語句執行時間
3.對語句進行最佳化:這個只能特定語句特定分析,不斷查詢語句執行時間來查看最佳化結果
語句最佳化完成效果
上面2、3都是單獨作用時的,可以看到效果還是很明顯的,只是並未達到令人滿意的效果,但2、3結合使用後效果就驚人了
SQL 資料庫高CPU佔用語句排查