尹 宇
(施耐德電氣(中國)有限公司西安分公司 陜西 710075)
隨著企業應用的復雜度逐步加大,數據量也變的比以前多很多。優化SQL SERVER數據庫成了,我們在開發應用的時候,刻不容緩的事情。
(1)優化過程
數據庫優化的步驟包括采集分析數據,制定優化方案,實施,評估。
(2)采集分析數據
根據不同數據庫的情況,準備一些數據庫的腳本,對采集數據來說非常重要。例如I/O的優化。在sql server的運行過程中,與硬盤交互的時候,如果讀寫不能順利完成,數據庫就有可能損壞。一個通常的規則就是,把日志文件和數據文件放在不同的物理盤中。
Dynamic Management Views可以檢測I/O瓶頸。
數據庫由于I/O引起系統系能下降時,可以通過以下SQL看到:

以下語句可以看到是哪個磁盤引起的瓶頸:

(3)制定方案
對于有風險的方案,一定要先備份數據庫。制定方案的時候,要有開發人員,數據庫專家,系統管理員來參加。
(4)實施
方案完成以后,要進行實施。實施一般是在業務空閑時間進行的。實施的過程中,應該有檢查點。我們可以對著檢查點,一項一項的去執行。當實施過程中出現問題的時候,要及時的調整策略,進行恢復。
(5)評估
要從系統和應用兩個層面來評估,優化的結果。系統方面:CPU的使用,I/O的使用,系統內存,網絡狀態。應用方面:sql的響應時間,sql的執行計劃,數據庫負載情況。
系統優化是資源配置的優化。系統優化的重點在于找到系統的瓶頸。由于有的時候,我們對系統不是特別的了解。優化起來就有困難。需要我們利用系統已經有的工具。例如:CPU性能調優。用windows任務管理器可以發現哪一個實例消耗了大量的CPU

圖1 CPU資源消耗
通過以上圖片我們可以看到是哪個實例消耗了大量的CPU資源,通過這種方法,我可以很方便的定位出消耗資源的實例。
數據庫消耗大的 sql語句,索引的設計,鎖的應用等都是導致數據庫變慢的很重要的因素。
(1)索引的設計
在經常變動的表上,索引不要過多。對于小表,不要建立索引。
數據庫數據的變化,也會降低索引的性能,所以需要定期的重建索引。我們還可以用我們平時積累的腳本來分析索引的性能。
不要用SELECT *這樣的語句,這樣的語句會使索引失效,應用的時候,只列出需要查詢的列。
(2)限定語句的復雜度
對于動態SQL,很多時候會讓用戶根據自己的條件進行組合查詢,這樣雖然功能強大。但是過多的選擇條件,復雜的sql,會造成性能的下降。
最好使用臨時表來存儲大量數據。
對于性能低下的SQL語句,減少語句的logical reads是關鍵。 logical reads指執行時需訪問的單位為8K的數據頁總數。如果logical reads 越少,則需要內存和CPU時間就越少,語句執行速度就快。以下運行set statistics io命令可以得到logical reads。

如果Logical reads與返回行數相差大,就需要優化此語句。
通過以上步驟,我們可以對我們的數據庫進行優化。但是,優化一般不是一次就能夠完成的。我們需要根據實際情況。進行多次優化,調整我們的計劃,達到我們的優化目的。
[1] 白鱔,著.Oracle優化日記.人民郵電出版社.2012
[2] Mike Hotek,著.傳思,譯.SQL SERVER2008實現與維護.清華大學出版社.2011
[3] 徐海蔚,著.Microsoft SQL Server企業級平臺管理實踐.電子工業出版社,2010.
[4] www.mssqltips.com