大內(nèi)存SQLServer數(shù)據(jù)庫的加速劑
導(dǎo)讀:為數(shù)據(jù)庫配置比較大的內(nèi)存,可以有效提高數(shù)據(jù)庫性能。因?yàn)閿?shù)據(jù)庫在運(yùn)行過程中,會在內(nèi)存中劃出一塊區(qū)域來作為數(shù)據(jù)緩存。通常情況下,用戶訪問數(shù)據(jù)庫時(shí),數(shù)據(jù)先會被讀取到這個(gè)數(shù)據(jù)緩存中。當(dāng)下次用戶還需要訪問這個(gè)數(shù)據(jù)時(shí),就會從這個(gè)數(shù)據(jù)緩存中讀取。因?yàn)樵跀?shù)據(jù)緩存中讀取數(shù)據(jù)要比在硬盤上讀取數(shù)據(jù)快幾百倍。所以擴(kuò)大數(shù)據(jù)庫服務(wù)器內(nèi)存,可以有效提高數(shù)據(jù)庫性能,特別是操作大型數(shù)據(jù)庫時(shí)效果更加明顯。
但是,現(xiàn)在企業(yè)中普遍采用的數(shù)據(jù)庫服務(wù)器都是32位的操作系統(tǒng)。而這個(gè)32位的操作系統(tǒng)卻有***內(nèi)存的使用限制。通常情況下,標(biāo)準(zhǔn)的32位地址最多可以采用4GB的內(nèi)存。若數(shù)據(jù)庫管理員想讓數(shù)據(jù)庫系統(tǒng)采用更多的內(nèi)存來提高數(shù)據(jù)庫的性能,則就需要進(jìn)行額外的配置。下面筆者就介紹兩種常用的配置方式,讓SQLServer數(shù)據(jù)庫服務(wù)器支持大內(nèi)存,讓其成為數(shù)據(jù)庫的加速劑。
一、讓數(shù)據(jù)庫應(yīng)用程序支持3GB的內(nèi)存空間
雖然操作系統(tǒng)支持4GB內(nèi)存??墒?,這并不會全部給數(shù)據(jù)庫等應(yīng)用程序使用。默認(rèn)情況下,在32位操作系統(tǒng)中,將有2GB的內(nèi)存空間是為操作系統(tǒng)所保留的。即使沒有用完,其他應(yīng)用程序也是不能夠染指的。而包含SQL Server數(shù)據(jù)庫在內(nèi)的所有應(yīng)用程序,只能過采用剩余的2GB內(nèi)存空間。
但是,在實(shí)際應(yīng)用中,操作系統(tǒng)往往用不著多大2G的內(nèi)存。根據(jù)筆者的經(jīng)驗(yàn),一般只要為操作系統(tǒng)保留1G的內(nèi)存已經(jīng)足夠其使用。只要沒有病毒等不良因素作怪,這個(gè)內(nèi)存不會被完全適用。如此的話,應(yīng)用程序可以采用的內(nèi)存空間就會多達(dá)3G,比原先整整多出一個(gè)G來。
要實(shí)現(xiàn)這個(gè)轉(zhuǎn)變,其實(shí)很簡單。在Windows操作系統(tǒng)中,有一個(gè)BOOT啟動(dòng)配置文件。為了讓數(shù)據(jù)庫服務(wù)器支持3GB的用戶模式進(jìn)程空間,必須在這個(gè)配置文件中,加入一個(gè)/3gb的參數(shù),然后重新啟動(dòng)操作系統(tǒng)即可。這么設(shè)置之后,應(yīng)用程序就可以尋址3GB的進(jìn)程地址空間 ,而為操作系統(tǒng)保留1GB的內(nèi)存空間。
有時(shí)候,這個(gè)小小的配置可以在很大程度上提高數(shù)據(jù)庫的性能。記得有一次,筆者為一家企業(yè)優(yōu)化數(shù)據(jù)庫性能。筆者查看了用戶的數(shù)據(jù)庫環(huán)境之后,就建議用戶增大數(shù)據(jù)庫服務(wù)器的內(nèi)存,從2G增加到4G??墒?,效果并沒有很大的改善。正當(dāng)筆者束手無措的時(shí)候,就想到了改變操作系統(tǒng)與應(yīng)用程序的內(nèi)存分配方式。為此,筆者就更改了BOOT啟動(dòng)配置文件,只給操作系統(tǒng)保留1G的內(nèi)存空間。重新啟動(dòng)后,數(shù)據(jù)庫性能得到了很大的改善。
二、為SQLServer啟用更高的內(nèi)存支持
如果數(shù)據(jù)庫應(yīng)用程序內(nèi)存尋址空間達(dá)到3GB后,數(shù)據(jù)庫管理員還不滿足的話,則就需要通過增加物理內(nèi)存的方式,來提高應(yīng)用程序的性能。若需要服務(wù)器操作系統(tǒng)突破其默認(rèn)4GB內(nèi)存空間的限制,支持4GB以上的內(nèi)存空間,也不是不可能的。只是需要進(jìn)行額外的配置,并且,其維護(hù)的工作量也比較大。
若想要SQLServer數(shù)據(jù)庫支持4GB以上的內(nèi)存尋址空間,則往往需要進(jìn)行如下配置。
***步:鎖定內(nèi)存頁。
默認(rèn)情況下,內(nèi)存大小與操作系統(tǒng)的虛擬內(nèi)存之間有一個(gè)正比例關(guān)系。在這里,數(shù)據(jù)庫管理員只想增大服務(wù)器的物理內(nèi)存,而不想對虛擬內(nèi)存有什么影響。故需要鎖定內(nèi)存頁。鎖定內(nèi)存頁的主要作用就是確定哪些帳戶可以使用進(jìn)程將數(shù)據(jù)保留在物理內(nèi)存中,從而阻止系統(tǒng)將數(shù)據(jù)分頁到磁盤的虛擬內(nèi)存中。默認(rèn)情況下,這個(gè)選項(xiàng)的只為OFF。也就是說,在必要的時(shí)候,系統(tǒng)會將數(shù)據(jù)分頁到硬盤的虛擬空間中。為了***程度發(fā)揮內(nèi)存的效用,就需要把這個(gè)選項(xiàng)開啟。不過這數(shù)據(jù)庫管理員往往需要尋求系統(tǒng)管理員的幫助,因?yàn)橹挥芯哂邢到y(tǒng)管理員權(quán)限的用戶,才能夠給更改這個(gè)選項(xiàng)。
第二步:啟用Awe Enable選項(xiàng)。
默認(rèn)情況下,即使服務(wù)器操作系統(tǒng)支持4GB以上的內(nèi)存空間,可是數(shù)據(jù)庫應(yīng)用程序并不一定支持。為了讓SQLServer應(yīng)用程序也支持這個(gè),就必須更改數(shù)據(jù)庫的配置參數(shù)。也就是說,需要將這個(gè)選項(xiàng)的值設(shè)置為1,然后重新啟動(dòng)數(shù)據(jù)庫系統(tǒng)。這個(gè)配置比較簡單,只需要利用命令sp_configure 'awe enabled', 1即可。不過在進(jìn)行這個(gè)配置之前,需要注意兩個(gè)細(xì)節(jié)方面的內(nèi)容。一是數(shù)據(jù)庫用戶需要這個(gè)操作的權(quán)限。二是這里有一個(gè)BUG,即在SQL Server數(shù)據(jù)庫中會有一個(gè)錯(cuò)誤信息。數(shù)據(jù)庫管理員可以忽略這個(gè)信息。
第三步:限制文件系統(tǒng)緩存。
若增加的內(nèi)存給操作系統(tǒng)或者其他應(yīng)用程序用了,那么數(shù)據(jù)庫管理員不是白忙一場嗎?為此,數(shù)據(jù)庫管理員還需要優(yōu)化數(shù)據(jù)庫系統(tǒng)內(nèi)存的使用情況。如需要限制系統(tǒng)用于文件緩存的內(nèi)存量。如要這么處理的話,只需要簡單的三個(gè)步驟即可。
首先,數(shù)據(jù)庫管理員在操作系統(tǒng)中,找到控制面板,并雙擊網(wǎng)絡(luò)連接,然后選中本地連接。其次,雙擊本地連接,在彈出的對話框中,找到常規(guī)選項(xiàng)卡,單擊屬性。選中網(wǎng)絡(luò)文件與打印機(jī)共享,并單擊屬性。***,在彈出的對話框中,去掉“***化網(wǎng)絡(luò)應(yīng)用程序數(shù)據(jù)吞吐量”復(fù)選框。一路按確認(rèn)即可。這個(gè)簡單的步驟,就可以優(yōu)化數(shù)據(jù)庫內(nèi)存的使用率。
三、大內(nèi)存維護(hù)管理幾個(gè)關(guān)鍵點(diǎn)
在通常情況下,往往不需要啟用4GB以上的內(nèi)存。但是,若在服務(wù)器上,同時(shí)啟用了其他的應(yīng)用程序服務(wù)。如在一臺服務(wù)器上同時(shí)有數(shù)據(jù)庫應(yīng)用程序、郵件應(yīng)用程序、文件服務(wù)器等多個(gè)應(yīng)用服務(wù)的話,則可能原有的4GB內(nèi)存無法滿足。系統(tǒng)管理員不得不對內(nèi)存進(jìn)行升級。但是,對內(nèi)存升級之后,數(shù)據(jù)庫管理員需要手工對內(nèi)存的分配進(jìn)行干預(yù),以免SQLServer應(yīng)用程序占用比較多的內(nèi)存空間,而影響其他應(yīng)用程序的性能。
1、配置max server memory選項(xiàng)。雖然說這個(gè)選項(xiàng)并不是必須要修改的,但是筆者仍強(qiáng)烈建議數(shù)據(jù)庫管理員要修改這個(gè)選項(xiàng)。特別是數(shù)據(jù)庫應(yīng)用程序與其他應(yīng)用程序共享同一臺服務(wù)器時(shí)。因?yàn)閱?dòng)SQLServer對大內(nèi)存的支持后(將Awe Enabled設(shè)置為1),而且可用物理內(nèi)存大于用戶模式進(jìn)程空間。則當(dāng)啟動(dòng)數(shù)據(jù)庫服務(wù)器時(shí),運(yùn)行的SQLServer實(shí)例將會占用幾乎所有的可用內(nèi)存(不管需不需要使用,數(shù)據(jù)庫服務(wù)器程序會先鎖定這些內(nèi)存。這就叫占著茅坑不拉屎)。而這個(gè)max server memory選項(xiàng)就是用來配置其***可以占用的內(nèi)存數(shù)量。數(shù)據(jù)庫管理員需要預(yù)先估算出一個(gè)合理的數(shù)值,然后進(jìn)行配置。讓數(shù)據(jù)庫應(yīng)用程序與其他應(yīng)用服務(wù)能夠共同改善,至少不能夠?qū)ζ渌麘?yīng)用程序的性呢產(chǎn)生不良影響。在比較極端的情況下,可以在升級內(nèi)存之前,先關(guān)閉數(shù)據(jù)庫應(yīng)用程序;然后啟用其他應(yīng)用程序服務(wù)。觀測一段時(shí)間,看看他們所需要用到多少的內(nèi)存。然后升級內(nèi)存,并為其他應(yīng)用程序至少保留以前所需要的內(nèi)存空間。否則的話,就會對其他應(yīng)用程序產(chǎn)生不良影響。犧牲其他應(yīng)用程序的性能來提高數(shù)據(jù)庫的性能,這是拆西墻補(bǔ)東墻的做法,不值得取。
2、多個(gè)SQLServer實(shí)例內(nèi)存如何分配。往往在一個(gè)SQLServer數(shù)據(jù)庫中,會配置多個(gè)數(shù)據(jù)庫實(shí)例。一個(gè)數(shù)據(jù)庫實(shí)例用來負(fù)責(zé)ERP系統(tǒng)的運(yùn)行,另外一個(gè)則是給CRM系統(tǒng)使用。在同一個(gè)數(shù)據(jù)庫系統(tǒng)中,有多個(gè)數(shù)據(jù)庫實(shí)例,此時(shí)該如何在各個(gè)實(shí)例之間分配可用的內(nèi)存呢?這基于操作系統(tǒng)的不同,又有所不同。如果數(shù)據(jù)庫操作系統(tǒng)采用的是2000系列的,則需要為每個(gè)數(shù)據(jù)庫實(shí)例配置max server memory選項(xiàng)。否則的話,其中某一個(gè)數(shù)據(jù)庫實(shí)例就有可能鎖定全部的可用內(nèi)存。這主要是因?yàn)?000系列的服務(wù)器系統(tǒng)并不支持動(dòng)態(tài)分配大內(nèi)存。所以需要為每個(gè)數(shù)據(jù)庫實(shí)例配置這個(gè)選項(xiàng)。但是,若數(shù)據(jù)庫服務(wù)器采用的是2003系列的服務(wù)器操作系統(tǒng),則不需要進(jìn)行手工的配置這些參數(shù)。因?yàn)椴僮飨到y(tǒng)會動(dòng)態(tài)地分配內(nèi)存。也就是說,操作系統(tǒng)會按照總體系統(tǒng)要求平衡SQLServer各個(gè)實(shí)例之間內(nèi)存的使用。不過為了提高數(shù)據(jù)庫整體性能,***還是為各個(gè)實(shí)例配置max server memory;而不讓操作系統(tǒng)來搞平衡。
從上文中可以總結(jié)出大內(nèi)存是好處多多,大內(nèi)存加速了SQLServer數(shù)據(jù)庫,使SQLServer數(shù)據(jù)庫的操作性能更為的優(yōu)化,實(shí)現(xiàn)了SQLServer數(shù)據(jù)庫的高速發(fā)展。
【編輯推薦】