如何提高SQL Server數據庫的性能該從哪裡入手呢?筆者認為該遵循從外到內的順序來改善數據庫的運行性能如下圖
第一層網絡環境
到企業碰到數據庫反映速度比較慢時首先想到的是是否是網絡環境所造成的而不是一開始就想著如何去提高數據庫的性能這是很多數據庫管理員的一個誤區因為當網絡環境比較惡劣時你就算再怎麼去改善數據庫性能也是枉然
如以前有個客戶向筆者反映數據庫響應時間比較長讓筆者給他們一個提高數據庫性能的解決方案那時筆者感到很奇怪因為據筆者所知這家客戶數據庫的記錄量並不是很大而且他們配置的數據庫服務器硬件很不錯筆者為此還特意跑到他們企業去查看問題的原因一看原來是網絡環境所造成的這家企業的客戶機有多台而且都是利用集線器進行連接這就導致企業內部網絡廣播泛濫網絡擁塞而且由於沒有部署企業級的殺毒軟件網絡內部客戶機存在病毒掠奪了一定的帶寬不僅數據庫系統響應速度比較慢而且其他應用軟件如郵箱系統速度也不理想
在這種情況下即使再花十倍百倍力氣去提升SQL Server數據庫的性能也是竹籃子打水一場空因為現在數據庫服務器的性能瓶頸根本不在於數據庫本身而在於企業的網絡環境若網絡環境沒有得到有效改善則SQL Server數據庫性能是提高不上去的
為此筆者建議這家企業想跟他們的網絡管理員談談看看如何改善企業的網絡環境減少廣播包和網絡沖突;並且有效清除局域網內的病毒木馬等等三個月後我再去回訪這家客戶的時候他們反映數據庫性能有了很大的提高而且其他應用軟件性能也有所改善
所以當企業遇到數據庫性能突然降低的時候第一個反應就是查看網絡環境看看其實否有惡化只有如此才可以少走冤枉路
第二層服務器配置
這裡指的服務器配置主要是講數據庫服務器的硬件配置以及周邊配套雖然說提高數據庫的硬件配置需要企業付出一定的代價但是這往往是一個比較簡便的方法比起優化SQL語句來說其要簡單的多
如企業可以通過增加硬盤的數量來改善數據庫的性能在實際工作中硬盤輸入輸出瓶頸經常被數據庫管理員所忽視其實到並發訪問比較多的時候硬盤輸入輸出往往是數據庫性能的一個主要瓶頸之一此時若數據庫管理員可以增加幾個硬盤通過磁盤陣列來分散磁盤的壓力無疑是提高數據庫性能的一個捷徑
如增加服務器的內存或者CPU當數據庫管理員發現數據庫性能的不理想是由內存或者CPU所造成的此時任何的改善數據庫服務器本身的措施都將一物用處所以有些數據庫管理專家把改善服務器配置當作數據庫性能調整的一個先決條件
如解決部署在同一個數據庫服務器上的資源爭用問題雖然我們多次強調要為數據庫專門部署一個服務器但是不少企業為了降低信息化的成本往往把數據庫服務器跟應用服務器放在同一個服務器中這就會導致不同服務器之間的資源爭用問題如把文件服務器跟數據服務器部署在同一個服務器中當對文件服務器進行備份時數據庫性能就會有明顯的下降所以在數據庫性能發現周期性的變化時就要考慮是否因為服務器上不同應用對資源的爭奪所造成的
故筆者建議改善數據庫性能時第二個需要考慮的層面就是要看看能否通過改善服務器的配置來實現
第三層數據庫服務器
當通過改善網絡環境或者提高服務器配置都無法達到改善數據庫性能的目的時接下去就需要考察數據庫服務器本身了首先就需要考慮數據庫服務器的配置
一方面要考慮數據庫服務器的連接模式SQL Server數據庫提供了很多的數據庫模式不同的數據庫連接模式對應不同的應用若數據庫管理員能夠熟悉企業自身的應用並且選擇合適的連接模式這往往能夠達到改善數據庫性能的目的
其次合理配置數據庫服務器的相關作業如出於安全的需要數據庫管理員往往需要對數據庫進行備份那麼備份的作業放在什麼時候合適呢?當然放在夜晚夜深人靜的時候對數據庫進行備份最好另外對於大型數據庫每天都進行完全備份將會是一件相當累人的事情雖然累得不是我們可是數據庫服務器也會吃不消差異備份跟完全備份結合將是改善數據庫性能的一個不錯的策略
第四層數據庫對象
若以上三個層面後數據庫性能還不能夠得到大幅度改善的話則就需要考慮是否能夠調整數據庫對象來完成我們的目的雖然調整數據庫對象往往可以提到不錯的效果但是往往會對數據庫產生比較大的影響所以筆者一般不建議用戶一開始就通過調整數據庫對象來達到改善數據庫性能的目的
數據庫對象有表視圖索引關鍵字等等我們也可以通過對這些對象進行調整以實現改善數據庫性能的目標
如在視圖設計時盡量把其顯示的內容縮小寧可多增加視圖如出貨明細表銷售人員可能希望看到產品編號產品中英文描述產品名字出貨日期客戶編號客戶名字等等但是對於財務來說可能就不需要這麼全的信息他們只需要產品編號客戶編號出貨日期等等少量的信息即可所以能可浪費一點代碼的空間設計兩張視圖對應不同部門的需求如此財務部門在查詢數據時不會為不必要的數據浪費寶貴的資源
如可以通過合理設置索引來提高數據庫的性能索引對於提高數據的查詢效率有著非常好的效果對一些需要重復查詢的數據或者數據修改不怎麼多的表設置索引無疑是一個不錯的選擇
另外要慎用存儲過程雖然說存儲過程可以幫助大家實現很多需求但是在萬不得已的情況下不要使用存儲過程而利用前台的應用程序來實現需求這主要是因為在通常情況下前台應用程序的執行效率往往比後台數據庫存儲過程要高的多
第五層SQL 語句
若以上各個層面你都努力過但是還不滿足由此帶來的效果的話則還有最後一招通過對SQL語句進行優化也可以達到改善數據庫性能的目的
雖然說SQL Server服務器自身就帶有一個SQL語句優化器他會對用戶的SQL語句進行調整優化以達到一個比較好的執行效果但是據筆者的了解這個最多只能夠優化一些粗略的層面或者說%的優化仍然需要數據庫管理員的配合要數據庫管理員跟SQL優化器進行配合才能夠起到非常明顯的作用
不過SQL語句的調整對於普通數據庫管理員來說可能有一定的難度除非受過專業的訓練一般很難對SQL語句進行優化還好筆者受過這方面的專業訓練對這方面有比較深的認識如在SQL語句中避免使用直接量任何一個包含有直接量的SQL語句都不太可能被再次使用我們數據庫管理員要學會利用主機變量來代替直接量不然這些不可再用的查詢語句將使得程序緩存被不可再用的SQL語句填滿這都是平時工作中的一些小習慣
總之筆者認為在數據庫性能調優的時候若能夠遵循如上的順序必定可以讓我們少走冤枉路不花無用功其實數據庫調優並沒有我們想象的這麼難只要我們能夠掌握其中的訣竅數據庫調優將可以手到擒來
From:http://tw.wingwit.com/Article/program/SQLServer/201311/22452.html