|
如何提高SQL Server數(shù)據(jù)庫的性能,該從哪里入手呢?筆者認(rèn)為,該遵循從外到內(nèi)的順序,來改善數(shù)據(jù)庫的運(yùn)行性能。如下圖:
第一層:網(wǎng)絡(luò)環(huán)境
到企業(yè)碰到數(shù)據(jù)庫反映速度比較慢時,首先想到的是是否是網(wǎng)絡(luò)環(huán)境所造成的。而不是一開始就想著如何去提高數(shù)據(jù)庫的性能。這是很多數(shù)據(jù)庫管理員的一個誤區(qū)。因?yàn)楫?dāng)網(wǎng)絡(luò)環(huán)境比較惡劣時,你就算再怎么去改善數(shù)據(jù)庫性能,也是枉然。
如以前有個客戶,向筆者反映數(shù)據(jù)庫響應(yīng)時間比較長,讓筆者給他們一個提高數(shù)據(jù)庫性能的解決方案。那時,筆者感到很奇怪。因?yàn)閾?jù)筆者所知,這家客戶數(shù)據(jù)庫的記錄量并不是很大。而且,他們配置的數(shù)據(jù)庫服務(wù)器硬件很不錯。筆者為此還特意跑到他們企業(yè)去查看問題的原因。一看原來是網(wǎng)絡(luò)環(huán)境所造成的。這家企業(yè)的客戶機(jī)有200多臺,而且都是利用集線器進(jìn)行連接。這就導(dǎo)致企業(yè)內(nèi)部網(wǎng)絡(luò)廣播泛濫,網(wǎng)絡(luò)擁塞。而且由于沒有部署企業(yè)級的殺毒軟件,網(wǎng)絡(luò)內(nèi)部客戶機(jī)存在病毒,掠奪了一定的帶寬。不僅數(shù)據(jù)庫系統(tǒng)響應(yīng)速度比較慢,而且其他應(yīng)用軟件,如郵箱系統(tǒng),速度也不理想。
在這種情況下,即使再花十倍、百倍力氣去提升SQL Server數(shù)據(jù)庫的性能,也是竹籃子打水一場空。因?yàn)楝F(xiàn)在數(shù)據(jù)庫服務(wù)器的性能瓶頸根本不在于數(shù)據(jù)庫本身,而在于企業(yè)的網(wǎng)絡(luò)環(huán)境。若網(wǎng)絡(luò)環(huán)境沒有得到有效改善,則SQL Server數(shù)據(jù)庫性能是提高不上去的。
為此,筆者建議這家企業(yè),想跟他們的網(wǎng)絡(luò)管理員談?wù)劊纯慈绾胃纳破髽I(yè)的網(wǎng)絡(luò)環(huán)境,減少廣播包和網(wǎng)絡(luò)沖突;并且有效清除局域網(wǎng)內(nèi)的病毒、木馬等等。三個月后,我再去回訪這家客戶的時候,他們反映數(shù)據(jù)庫性能有了很大的提高。而且其他應(yīng)用軟件,性能也有所改善。
所以,當(dāng)企業(yè)遇到數(shù)據(jù)庫性能突然降低的時候,第一個反應(yīng)就是查看網(wǎng)絡(luò)環(huán)境,看看其實(shí)否有惡化。只有如此,才可以少走冤枉路。
第二層:服務(wù)器配置
這里指的服務(wù)器配置,主要是講數(shù)據(jù)庫服務(wù)器的硬件配置以及周邊配套。雖然說,提高數(shù)據(jù)庫的硬件配置,需要企業(yè)付出一定的代價(jià)。但是,這往往是一個比較簡便的方法。比起優(yōu)化SQL語句來說,其要簡單的多。
如企業(yè)可以通過增加硬盤的數(shù)量來改善數(shù)據(jù)庫的性能。在實(shí)際工作中,硬盤輸入輸出瓶頸經(jīng)常被數(shù)據(jù)庫管理員所忽視。其實(shí),到并發(fā)訪問比較多的時候,硬盤輸入輸出往往是數(shù)據(jù)庫性能的一個主要瓶頸之一。此時,若數(shù)據(jù)庫管理員可以增加幾個硬盤,通過磁盤陣列來分散磁盤的壓力,無疑是提高數(shù)據(jù)庫性能的一個捷徑。
如增加服務(wù)器的內(nèi)存或者CPU。當(dāng)數(shù)據(jù)庫管理員發(fā)現(xiàn)數(shù)據(jù)庫性能的不理想是由內(nèi)存或者CPU所造成的,此時,任何的改善數(shù)據(jù)庫服務(wù)器本身的措施都將一物用處。所以,有些數(shù)據(jù)庫管理專家,把改善服務(wù)器配置當(dāng)作數(shù)據(jù)庫性能調(diào)整的一個先決條件。
如解決部署在同一個數(shù)據(jù)庫服務(wù)器上的資源爭用問題。雖然我們多次強(qiáng)調(diào),要為數(shù)據(jù)庫專門部署一個服務(wù)器。但是,不少企業(yè)為了降低信息化的成本,往往把數(shù)據(jù)庫服務(wù)器跟應(yīng)用服務(wù)器放在同一個服務(wù)器中。這就會導(dǎo)致不同服務(wù)器之間的資源爭用問題。如把文件服務(wù)器跟數(shù)據(jù)服務(wù)器部署在同一個服務(wù)器中,當(dāng)對文件服務(wù)器進(jìn)行備份時,數(shù)據(jù)庫性能就會有明顯的下降。所以,在數(shù)據(jù)庫性能發(fā)現(xiàn)周期性的變化時,就要考慮是否因?yàn)?a href=/yuedu/fuwuqi/ target=_blank class=infotextkey>服務(wù)器上不同應(yīng)用對資源的爭奪所造成的。
故,筆者建議,改善數(shù)據(jù)庫性能時第二個需要考慮的層面,就是要看看能否通過改善服務(wù)器的配置來實(shí)現(xiàn)。
第三層:數(shù)據(jù)庫服務(wù)器
當(dāng)通過改善網(wǎng)絡(luò)環(huán)境或者提高服務(wù)器配置,都無法達(dá)到改善數(shù)據(jù)庫性能的目的時,接下去就需要考察數(shù)據(jù)庫服務(wù)器本身了。首先,就需要考慮數(shù)據(jù)庫服務(wù)器的配置。
一方面,要考慮數(shù)據(jù)庫服務(wù)器的連接模式。提供了很多的數(shù)據(jù)庫模式,不同的數(shù)據(jù)庫連接模式對應(yīng)不同的應(yīng)用。若數(shù)據(jù)庫管理員能夠熟悉企業(yè)自身的應(yīng)用,并且選擇合適的連接模式,這往往能夠達(dá)到改善數(shù)據(jù)庫性能的目的。
其次,合理配置數(shù)據(jù)庫服務(wù)器的相關(guān)作業(yè)。如出于安全的需要,數(shù)據(jù)庫管理員往往需要對數(shù)據(jù)庫進(jìn)行備份。那么,備份的作業(yè)放在什么時候合適呢?當(dāng)然,放在夜晚,夜深人靜的時候,對數(shù)據(jù)庫進(jìn)行備份最好。另外,對于大型數(shù)據(jù)庫,每天都進(jìn)行完全備份將會是一件相當(dāng)累人的事情。雖然累得不是我們,可是數(shù)據(jù)庫服務(wù)器也會吃不消。差異備份跟完全備份結(jié)合將是改善數(shù)據(jù)庫性能的一個不錯的策略。
第四層:數(shù)據(jù)庫對象
若以上三個層面后,數(shù)據(jù)庫性能還不能夠得到大幅度改善的話,則就需要考慮是否能夠調(diào)整數(shù)據(jù)庫對象來完成我們的目的。雖然調(diào)整數(shù)據(jù)庫對象往往可以提到不錯的效果,但是,往往會對數(shù)據(jù)庫產(chǎn)生比較大的影響。所以,筆者一般不建議用戶一開始就通過調(diào)整數(shù)據(jù)庫對象來達(dá)到改善數(shù)據(jù)庫性能的目的。
數(shù)據(jù)庫對象有表、視圖、索引、關(guān)鍵字等等。我們也可以通過對這些對象進(jìn)行調(diào)整以實(shí)現(xiàn)改善數(shù)據(jù)庫性能的目標(biāo)。
如在視圖設(shè)計(jì)時,盡量把其顯示的內(nèi)容縮小,寧可多增加視圖。如出貨明細(xì)表,銷售人員可能希望看到產(chǎn)品編號、產(chǎn)品中英文描述、產(chǎn)品名字、出貨日期、客戶編號、客戶名字等等。但是,對于財(cái)務(wù)來說,可能就不需要這么全的信息。他們只需要產(chǎn)品編號、客戶編號、出貨日期等等少量的信息即可。所以,能可浪費(fèi)一點(diǎn)代碼的空間,設(shè)計(jì)兩張視圖,對應(yīng)不同部門的需求。如此,財(cái)務(wù)部門在查詢數(shù)據(jù)時,不會為不必要的數(shù)據(jù)浪費(fèi)寶貴的資源。
如可以通過合理設(shè)置索引來提高數(shù)據(jù)庫的性能。索引對于提高數(shù)據(jù)的查詢效率,有著非常好的效果。對一些需要重復(fù)查詢的數(shù)據(jù)、或者數(shù)據(jù)修改不怎么多的表設(shè)置索引,無疑是一個不錯的選擇。
另外,要慎用存儲過程。雖然說存儲過程可以幫助大家實(shí)現(xiàn)很多需求。但是,在萬不得已的情況下,不要使用存儲過程。而利用前臺的應(yīng)用程序來實(shí)現(xiàn)需求。這主要是因?yàn)樵谕ǔG闆r下,前臺應(yīng)用程序的執(zhí)行效率往往比后臺數(shù)據(jù)庫存儲過程要高的多。
第五層:SQL 語句
若以上各個層面你都努力過,但是還不滿足由此帶來的效果的話,則還有最后一招。通過對SQL語句進(jìn)行優(yōu)化,也可以達(dá)到改善數(shù)據(jù)庫性能的目的。
雖然說SQL Server服務(wù)器自身就帶有一個SQL語句優(yōu)化器。他會對用戶的SQL語句進(jìn)行調(diào)整、優(yōu)化,以達(dá)到一個比較好的執(zhí)行效果。但是,據(jù)筆者的了解,這個最多只能夠優(yōu)化一些粗略的層面。或者說,80%的優(yōu)化仍然需要數(shù)據(jù)庫管理員的配合。要數(shù)據(jù)庫管理員跟SQL優(yōu)化器進(jìn)行配合,才能夠起到非常明顯的作用。
不過,SQL語句的調(diào)整對于普通數(shù)據(jù)庫管理員來說,可能有一定的難度。除非受過專業(yè)的訓(xùn)練,一般很難對SQL語句進(jìn)行優(yōu)化。還好筆者受過這方面的專業(yè)訓(xùn)練,對這方面有比較深的認(rèn)識。如在SQL語句中避免使用直接量。任何一個包含有直接量的SQL語句都不太可能被再次使用。我們數(shù)據(jù)庫管理員要學(xué)會利用主機(jī)變量來代替直接量。不然,這些不可再用的查詢語句將使得程序緩存被不可再用的SQL語句填滿。這都是平時工作中的一些小習(xí)慣。
總之,筆者認(rèn)為,在數(shù)據(jù)庫性能調(diào)優(yōu)的時候,若能夠遵循如上的順序,必定可以讓我們少走冤枉路,不花無用功。其實(shí),數(shù)據(jù)庫調(diào)優(yōu)并沒有我們想象的這么難。只要我們能夠掌握其中的訣竅,數(shù)據(jù)庫調(diào)優(yōu)將可以手到擒來。上文中講到的提高SQL Server數(shù)據(jù)庫性能大家要靈活運(yùn)用,這些方法也不是什么靈丹妙藥,要根據(jù)具體情況去操作,希望這篇文章在供大家參考的時候能夠幫到大家。
it知識庫:從外到內(nèi)提高SQL Server數(shù)據(jù)庫性能,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。