我想解決數據庫服務器上的SQL Server進程100%CPU使用率。在調查過程中,我現在已經發現存儲過程佔用大部分工作時間的事實。存儲過程吃CPU SQL Server 2005
對於DMV的以下查詢查找查詢取最高的時間,
SELECT TOP 20 st.text
,st.dbid
,st.objectid
,qs.total_worker_time
,qs.last_worker_time
,qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_worker_time DESC
大部分都是存儲過程。奇怪的是,所有這些存儲過程都在查詢不同的表。然而,儘管當我查看Profiler查詢具有最高CPU的查詢,持續時間時,他們是佔用大部分工作時間的首選,但存儲過程並不在頂部。
爲什麼會發生這種情況?
==編輯== 應用程序實際上使用adhoc查詢而不是存儲過程。其中一些程序將被遷移到使用adhoc查詢。問題在於這些過程不像其他一些查詢那樣頻繁調用,這些查詢是cpu密集型的,並且非常頻繁地被調用。 此外,它確實讓我奇怪的是,一個存儲過程用tbl做了一個簡單的select a,b,c,其中id = @ id的工作時間總和要高於具有多重連接的查詢, where子句,排序和row_number,而簡單的查詢有20000條記錄的表,複雜查詢位於具有超過200,000條記錄的表上。
所有這些告訴我的是,您的應用程序被編碼爲使用存儲過程訪問數據庫而不是特別查詢。這不是一件壞事。有很多其他因素可能會導致服務器CPU被掛起。沒有足夠的動力來滿足需求?這是所有的時候還是在使用高峯期?索引適當?等等等等...... – Yuck 2012-04-04 19:02:56
'total_worker_time'當然是累積的,而profiler顯示個別執行的數字。也許這些只是非常頻繁地執行。 – 2012-04-04 19:04:15
@yuck增加了一些信息。我知道,爲什麼cpu使用率達到100%的原因可能有很多,但即使在低負載情況下,它的使用率也達到了100%。一直在調整/ defraging索引等 – shashi 2012-04-04 20:12:11