在SQL Server數據庫中,有min server memory與max server memory兩個內存選項。數據庫管理員合理設置這兩個選項可以讓SQL Server數據庫系統與其他英勇程序和平共存。顧名思義,min server memory就是設置數據系統所使用的最小內存,而max server memory用來設置其可以使用的最大內存。
一、SQL Server數據庫的內存管理機制。
在數據庫啟動的時候,其實數據庫引擎並不會馬上在內存中抓取min參數規定的內存量。這種占著茅坑不拉屎的事情SQL Server數據庫是不會做的。系統在剛開始啟動的時候,數據庫緩沖池只抓取初始化所需要的內存,如上圖所示。數據庫啟動之後隨著業務量的增大,數據庫引擎的工作負荷也會隨之增加。此時數據庫引擎會繼續獲取完成工作所需要的內存。在達到min規定的內存數量之前,數據庫引擎緩沖池是不會釋放它獲取的任何內存。如數據庫初始化內存為20M,而規定的min內存數量為50M。則可能因為用戶查詢某個負責報表的需要,內存需要量會達到40M。查詢作業執行完畢後數據庫系統緩沖池實際使用的內存量可能只需要20M即可。但是只要沒有達到50M這個值。則數據庫系統不會把沒有的20M內存還給操作系統,而是一直占用著,以方面後續的作業。
如果用戶需要調用數據庫系統中的函數或者過程,此時內存的需要量可能會超過規定的最小內存量,如達到80M。此時數據庫引擎會根據一定的標准算法,根據需要來獲取和釋放內存。當需要使用超過50M的內存的時候,只要沒有達到內存的最大限值之前,則會根據系統提供的標准算法來獲取內存。至於這個標准算法到底是怎麼樣的,這不是我們數據庫管理員所需要關注的內容。然後等到這個過程或者函數調用完畢後,內存使用量可能會降低到最低內存數量以下,如又回復到40M。此時數據庫引擎就會釋放內存,把沒有用到的內存釋放出來給其他應用程序使用。但是這個釋放會有一個限制。數據庫引擎緩沖池從不將內存分配降低到最小內存所指定的水平下。也就是說,此時數據庫最多會釋放30M的內存,為自己留下50M的內存空間,即使當前其可能只需要用到40M內存空間即可。當然在抓取內存空間的時候,其也不會為自己分配高於MAX內存所規定的內存空間。
二、內存參數配置對其他應用系統的影響。
在一台服務器上,往往多個應用程序需要共享內存。如可能在一台服務器上部署了多個應用系統,至少在一台服務器上操作系統與SQL Server數據庫之間需要共存。為此SQL Server數據庫可以使用多少的內存空間,肯定會對其他的應用程序產生比較大的影響。
如在一台服務器上部署了SQL Server數據庫系統、郵件應用系統、ERP應用服務器等等三個應用系統。如果先啟動SQL Server數據庫系統,後來又要啟動郵件應用系統,此時郵件應用系統的啟動速度就會受到影響。因為某些應用程序在初始化的過程中可能會需要用到比較大的內存空間。而在啟動的過程中,可能數據庫在使用的內存比較多,剩余的內存不能夠滿足其他應用程序啟動的需要。此時其他應用程序在啟動時就會等待,等待數據庫應用程序釋放內存。這就會延長其他應用程序的啟動時間。
另外在執行某些工作的時候,也會影響到。如在同一個時間對數據庫與郵箱服務器進行備份作業。由於備份作業需要用到比較多的內存,此時就會發生內存爭用選項。為此如果能夠把數據庫的最低內存設置的比較低的話,則數據庫系統在用完內存話就可以馬上把內存釋放出來,而不會為自己保留比較大的暫時不同的內存空間。同理,在保障業務需求的情況下把最大內存設置的比較小,則可以為其他應用程序留下比較多的內存空間。
.
三、多個應用程序共存時的內存分配。
如果一台服務器上只運行了一個數據庫應用程序,或者說數據庫的應用比較簡單、數據庫內存使用量基本上不會超過最小內存數量的花,則可以采用默認多參數配置。但是如果在同一台服務器上部署了比較多的應用程序或者數據庫設計比較復雜,此時就需要對數據庫的最小內存與最大內存進行配置,以實現多個應用程序能夠實現和平共處。另外如果數據庫本身比較簡單,但是其他應用程序比較復雜,可能會占用90%以上的內存時,數據庫就需要采用一定的保護措施,需要設置最小內存與最大內存,來保障自己數據庫正常運行所需要的內存空間。
1、數據庫管理員需要監測內存的使用情況,並根據監測的數據來進行設置。由於采取的操作系統、部署的應用程序不同;甚至在SQL Server數據庫中啟用的服務不同,數據庫需要使用的內存數量也是不同的。為此沒有一個具體的標准說最小內存或者最大內存要配置多少。通常情況下需要數據庫管理員跟蹤數據庫服務器一段時間,看看其內存的使用量。如筆者建議用戶,數據庫系統正是投入使用後,在頭一年內需要每個月觀測一下內存的使用情況。由於頭幾個月可能使用的不穩定,所得到的數據參考價值不大。而從第六個月開始到第12個月近八個月數據庫內存的使用情況來看,基本上可以得出一個最小內存與最大內存的合理范圍。然後數據庫管理員就可以來對內存的最大最小值來進行設置。以後若前台應用程序做了新的調整或者數據庫中采用了新的功能,仍然需要對內存的使用情況進行監測,來確定一個合理的內存使用范圍。一般來說,最好把最小內存設置的小一點,而把最大內存的花設置的大一點。如此的話,可以讓數據庫引擎在管理內存的時候有比較大的靈活性。然後再進行後續監測的數據來進行相應的調整,慢慢的把內存配置調整到最優。根據筆者的經驗,要達到合理的內存配置之前,往往需要一個比較漫長的時間。不過這對於數據庫性能優化來說,可能這個過程也不是很長。
2、要分析數據庫系統內存的使用大戶,跟其他應用程序的內存使用高峰分流。數據庫中函數、過程、復雜的視圖、備份等作業都會用到比較可觀的內存。如企業如果在SQL Server數據庫上面部署了ERP系統,而系統中有一個“庫存采購”作業,這個需要用到比較復雜的業務邏輯,需要考慮到庫存、安全庫存、包裝數量等等比較復雜的計算。為此最好能夠把這個作業放到服務器比較空的時候運行,以跟其他應用程序錯開運行。如在應用程序設計的時候,可以把這個作業放在後台運行,並讓其在晚上12點運行。然後在第二天早上之前出來結果。另外每個應用程序都需要對自己的數據進行備份,以防不時之需。而備份程序往往也需要用到比較多的內存。為此最好能夠把各種應用程序的備份作業錯開來運行。如此的話可以減少應用程序之間內存的占用。
四、數據庫內存分配的特殊情況。
如果在同一個服務器上部署多個應用程序的話,內存的爭用是在所難免的。為此數據庫管理員往往需要為數據庫分配合適的內存參數,保證數據庫即能夠滿足其日常運行的需要,又盡量減少對其他應用程序的不良影響。在參數配置的過程中,除了需要考慮如上幾個建議之外,還需要注意數據庫內存分配中的特殊情況。
如果把最小內存與最大內存的值設置為相同,那麼會產生什麼情況呢?如果把它們設置為相同的值,則一旦分配給數據庫引擎的內存達到這個值的話,則數據庫引擎將停止為緩沖池動態釋放和獲取內存。也就是說,此時數據庫內存的分配就是固定的,不會根據數據庫引擎的負荷來動態的獲取或者釋放。顯然對於生成用的服務器來說,這並不是一個很好的配置。但是在一些特殊的應用下,卻可以起到比較不錯的效果。如需要測試數據庫某個作業與內存之間的關系,那麼就有可能需要把它們的值配置為相同。另外如果服務器中只運行了數據庫應用程序,那就有可能需要把這兩個參數設置的比較高,以減少數據庫內存釋放與獲取時所發生的額外開銷等等。
另外數據庫運行過程中的某些作業是不受這個最大內存的限制的。如數據庫中的進程可能會得到超過最大內存選項所指定的內存;數據庫的一些外部組建也可以得到緩沖池以外的內存。不過在大部分情況下,數據庫運行還是受到這個緩沖池內存的限制的。所以說在內存參數設置的時候,最好能夠留有一定的余地。