今天和大家聊一聊SQL server的內(nèi)存管理,說之前我們需要先提出一個問題,SQL Server到底是如何使用內(nèi)存的?弄清楚如何使用之后,才能談如何管理。
簡單說,SQL Server數(shù)據(jù)庫的內(nèi)存使用原則是有多少內(nèi)存就會占用多少內(nèi)存,不會自動釋放內(nèi)存。原因是它的存儲引擎本身是一個Windows下的進(jìn)程,所以在使用內(nèi)存時和其它Windows進(jìn)程是一樣的,都要向Windows申請內(nèi)存,申請到內(nèi)存之后,SQL Server的內(nèi)存使用可以粗略地分為兩個部分:一是緩沖池內(nèi)存,被數(shù)據(jù)頁和空閑頁占用;二是非緩沖內(nèi)存,被線程、DLL、鏈接服務(wù)器等占用。其中緩沖池內(nèi)存占大頭。
這樣會有什么問題呢?打個比方,如在執(zhí)行一條結(jié)果集很大的sql時,數(shù)據(jù)查詢?nèi)〕龊?,會一直占用?nèi)存,直到機(jī)器內(nèi)存被占滿(并不會撐爆,因為可以通過圖去限制最大內(nèi)存,一般占滿后仍然比服務(wù)器機(jī)器內(nèi)存稍?。?,在重啟數(shù)據(jù)庫服務(wù)前,SQL Server不會主動釋放該內(nèi)存,也沒有任何辦法可人為釋放,一直占用到max server memory的設(shè)定值,因此查看SQL Server的內(nèi)存基本使用率相對較高(80%以上)。
那怎么解決呢?最直接的辦法是:人為修改最大可占用物理內(nèi)存進(jìn)行限制。
方法一:
緩沖池所占內(nèi)存是通過下圖1最大服務(wù)器內(nèi)存和最小服務(wù)器內(nèi)存來設(shè)置的,因此sqlservr.exe所占的內(nèi)存(如圖2)有可能會大于圖1中所設(shè)置的最大內(nèi)存。管理員用戶登錄數(shù)據(jù)庫客戶端(Microsoft SQL Server Management Studio),在實例名(樹形菜單根節(jié)點,顯示登錄名那欄)上右鍵,選擇屬性-->內(nèi)存,設(shè)置“最大服務(wù)器內(nèi)存”即可根據(jù)實際情況調(diào)整內(nèi)存(單位為MB),如調(diào)整到當(dāng)前總的服務(wù)器內(nèi)存的70%左右使用率。
圖1 SQL Server可控制內(nèi)存選項
圖2 SQL Server進(jìn)程內(nèi)存使用情況
方法二:
如果使用的是華為云RDS SQL Server,那解決方法就更加簡單了,只需要到控制臺實例管理中修改最大內(nèi)存(max server memory)參數(shù)值即可,且修改完該參數(shù)不需要重啟數(shù)據(jù)庫,不得不說云數(shù)據(jù)庫使用起來更加便捷清晰/