2012-04-04 191 views
0

我想解決數據庫服務器上的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條記錄的表上。

+0

所有這些告訴我的是,您的應用程序被編碼爲使用存儲過程訪問數據庫而不是特別查詢。這不是一件壞事。有很多其他因素可能會導致服務器CPU被掛起。沒有足夠的動力來滿足需求?這是所有的時候還是在使用高峯期?索引適當?等等等等...... – Yuck 2012-04-04 19:02:56

+2

'total_worker_time'當然是累積的,而profiler顯示個別執行的數字。也許這些只是非常頻繁地執行。 – 2012-04-04 19:04:15

+0

@yuck增加了一些信息。我知道,爲什麼cpu使用率達到100%的原因可能有很多,但即使在低負載情況下,它的使用率也達到了100%。一直在調整/ defraging索引等 – shashi 2012-04-04 20:12:11

回答

1

這取決於你在該存儲過程做什麼,你是如何調整你的表,索引等

例如,如果您創建使用循環光標一樣的存儲過程,你將有最大CPU使用率。如果你沒有設置你的索引,並且你正在使用select來使用不同的連接等。你會讓你的CPU過載。

這是你如何使用你的數據庫。

一些提示:

  1. 我建議創建的大部分時間存儲過程。
  2. 當您創建存儲過程時,請使用執行計劃運行以獲取一些建議。
  3. 如果表中有很多記錄(超過1或2百萬),請考慮創建索引視圖。
  4. 僅在必要時進行更新或刪除,有時候最好只插入記錄並每天或每週運行一項作業以更新或刪除不需要的記錄。 (這取決於具體情況)