SQL Server性能優化案例報告

 SQL Server性能優化案例報告收藏
1. 問題分析
 

1.1             現象描述
某企業客戶內部知識管理系統基於微軟SharePoint服務器產品並進行了應用擴展開發,NLB負載均衡部署,後臺數據庫採用SQL Server 2000 企業版,雙核 4C 8G內存兩節點羣集。在兩三年的使用過程中,隨着系統用戶的增多,出現了數據庫服務器CPU佔用過高的情況,導致前端訪問響應速度慢,經常超時等問題。

 

1.2             性能計數器分析

 

用戶連接

經過對SQL Server關鍵性能指標的採集和分析,發現用戶連接指標數值過大。用戶連接的數據基本保持在700-1000之間,不僅是在忙時段(AM:10),且在閒時段(PM: 6)也基本保持不變,基本可以確定是數據庫連接池配置不當或有代碼沒有釋放可用連接,需要通過應用代碼進行問題排查。

鎖請求/秒

經過向用戶的瞭解,該系統爲多數讀取,少數寫入的系統,但從性能計數器的觀測值發現鎖請求/秒的指標值平均約爲158418.485,最高值可達到558870.266,鎖操作總體過大,應該從應用層面進行分析優化。

完全掃描/秒

完全掃描/秒計數器指示有多少不使用索引而進行的全表掃描,測量過程中顯示平均值達到100左右,最高值達到832.998,應分析SQL查詢語句和數據庫索引的對應關係,追加必要的索引以減少全表掃描的次數。

1.3             SQL工具分析

通過使用SQL 事件探查器和查詢分析器等工具對SQL Server內部語句執行的性能狀況列出了明細,並可將其中的CPU佔用較高的任務列出,如第一行顯示的大量數據連接導致CPU佔用較高、第二行復雜子查詢Join下存在部分索引未創建、wf_Instance_track表有大量過期的歷史數據時變慢等問題。

1.4             應用代碼分析
經過對系統源代碼的粗略分析,發現以下一些問題:

a.                    SqlHelper中的GetConnection每次都是創建一個全新的數據庫連接而返回給調用代碼,導致連接無法被重用,每次全新創建也會增加服務器的負擔;

b.                    SqlHelper中的TestConnection每次都是創建一個全新的數據庫並且打開連接以測試連接的可用性,但是並不關閉就返回了。

c.                    AcceptUpdate中的SelectDb調用SqlHelper中的GetConnection獲得連接後進行數據庫查詢操作,但使用後並不關閉相應連接

d.                   AcceptUpdate中的UpdateDs調用SqlHelper中的GetConnection獲得連接後進行數據庫更新操作,但使用後並不關閉相應連接

e.                    ColSelect.aspx中的btn_Ok_ServerClick調用SqlHelper中的GetConnection獲得連接後進行數據庫更新操作,但使用後並不關閉相應連接

 

2. 優化方案
2.1             代碼優化
a.       由統一的代碼管理數據庫連接;

b.      使用數據庫連接池技術管理連接;

c.       使用後必須關閉數據庫連接;

d.      減少全新創建數據庫連接的次數(如減少不必要的TestConnection操作)

e.       優化SQL語句,減少表鎖;

f.       優化SQL語句,使查詢能儘量使用索引,減少全表掃描;

g.      適當使用臨時表,以減少SQL複雜度和子查詢;

h.      其他與數據庫性能有關的代碼排查;

 

2.2             數據庫優化
a.       創建經常被查詢用到的索引;

b.      適當調整SQL 實例性能相關的參數,以使資源使用最大化(但要考慮爲操作系統保留小部分資源);

c.       備份和分離過期的歷史數據(如2006年的狀態跟蹤數據),並建立定期的數據庫清理機制;

d.      定期觀測和記錄SQL性能計數器,瞭解性能狀況變化;

e.       升級到更高版本的SQL Server 產品,使用分區表等新技術能夠發揮更佳的服務器性能;

 

2.3             優化工作量估算
代碼優化和測試驗證:約需10-15個工作日(依原有代碼質量和數量決定)

數據庫優化和測試驗證:約需5-7個工作日

3. 優化實施
3.1             代碼優化
對代碼結構進行了性能分析,發現了一些代碼質量問題。

目錄名
 文件名
 方法名
 
App_Code/Site
 AcceptUpdate.cs
 SelectDb
 
App_Code/Site
 AcceptUpdate.cs
 UpdateDs
 
FramePage
 ColSelect.aspx.cs
 btn_Ok_ServerClick
 
App_Code
 SqlHelper.cs
 GetConnection
 


 

分析、修改、部署共計3人天

 

注:尚未對存儲過程進行優化

 

3.2             數據庫優化
對執行性能差但使用頻率較高的部分數據表進行了索引創建。

表名
 索引列
 索引名
 

 
 
 


 

 

分析、修改、部署和測試和報告共計5人天

 

4. 優化總結
4.1             性能對比
 

性能參考對象
 優化前
 優化後(閒)
 優化後(忙)
 說明
 
系統CPU利用率
 86.235%左右
 15.183%左右
 45.583%左右
 具體截圖如下圖1
 
完全掃描/秒
 109.337左右
 23.175左右
 42.965左右
 具體截圖如下圖2
 
鎖請求/秒
 158418.485
 37101.090
 69444.232
 具體截圖如下圖3
 
索引搜索/秒
 98472
 25374
 43653
 具體截圖如下圖4
 
用戶連接數
 800-1200
 541
 820
 
 


 


圖0

 

 


圖1


圖2


圖3


圖4

4.2             待決問題
由於擔心影響業務邏輯的正確性和測試的複雜性,沒有對以下幾個部分進行優化:

1.      數據庫連接較多的問題,整體解決需要重新架構設計

2.      複雜度較高的SQL語句以及視圖的優化

3.      存儲過程的優化,防止表鎖

4.      工作流引擎內部機制不瞭解

4.3             系統建議
數據庫中表的數據量不是很大,單個簡單的查詢對整個系統的影響較小,較複雜的視圖或存儲過程優化有性能問題,隨着數據量的增大影響而更明顯,所以可定期清除不需要的歷史數據。

4.4             總結
通過增加對數據量較大的表以及查詢較頻繁的表增加索引,能夠減輕數據庫完全掃描的壓力,使CPU利用率下降。以上對比顯示,優化效果較明顯。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/redbirdli/archive/2009/03/11/3980810.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章