SQL?Server?內(nèi)存占用高分析及問題解決辦法
SQL Server 內(nèi)存占用高分析及解決辦法(超詳細(xì))
一、問題
1.1、SQL Server內(nèi)存占用高 ,內(nèi)存不釋放

1.2、SQL Server 內(nèi)存使用策略
SQL Server對服務(wù)器內(nèi)存的使用策略是有多少占多少(大約到剩余內(nèi)存為4M左右)只用在服務(wù)器內(nèi)存不足時,
才會釋放一點(diǎn)占用的內(nèi)存,所以很多時候,我們會發(fā)現(xiàn)運(yùn)行SQL Server的系統(tǒng)內(nèi)存往往居高不下這些內(nèi)存一般都
是SQL Server運(yùn)行時候用作緩存的。
數(shù)據(jù)緩存:
例如:你運(yùn)行一個select語句,那么SQL Server會將相關(guān)的數(shù)據(jù)頁(SQL Server操作的數(shù)據(jù)都是以頁為單位的,在
SQL Server中頁的大小始終是8kb的大小,頁有不同的類型:數(shù)據(jù)頁,索引頁,系統(tǒng)頁等等)加載到內(nèi)存中進(jìn)行
緩存,以便于再次請求此頁的數(shù)據(jù)的時候,直接從內(nèi)存返回,就無需讀取磁盤了,大大提高了速度。
執(zhí)行命令緩存:
如執(zhí)行存儲過程,自定函數(shù)時,SQL Server 需要先二進(jìn)制編譯再運(yùn)行,編譯后的結(jié)果也會緩存起來,再次調(diào)用時就無需再次編譯。
二、解決辦法
當(dāng)我們知道SQL Server 內(nèi)存占用方式,就有以下兩種解決辦法
-- 查看內(nèi)存使用情況,這個會返回多個結(jié)果集數(shù)據(jù),可以有助于我們排查內(nèi)存問題 DBCC MemoryStatus
結(jié)果集部分重要指標(biāo)解釋(請注意,DBCC MEMORYSTATUS的輸出格式和內(nèi)容可能會隨著SQL Server版本的不同而有所變化):對指標(biāo)不感興趣,一股腦解決問題可跳過 如下指標(biāo)查看,直接到下面 緩存清除命令
1、Total Server Memory (KB)
- 含義:SQL Server實(shí)際使用的內(nèi)存量(以千字節(jié)為單位)。
- 重要性:這是SQL Server當(dāng)前占用的實(shí)際物理內(nèi)存大小,直接反映了SQL Server對系統(tǒng)資源的影響。如果這個值接近或超過了配置的最大服務(wù)器內(nèi)存限制,可能表明存在內(nèi)存壓力。
2、Target Server Memory (KB)
- 含義:SQL Server理想情況下想要保留的內(nèi)存量(以千字節(jié)為單位),基于當(dāng)前負(fù)載和配置參數(shù)計(jì)算得出的目標(biāo)值。
- 重要性:與
Total Server Memory對比,可以幫助識別是否存在內(nèi)存不足的情況。如果Total Server Memory遠(yuǎn)低于Target Server Memory,則可能是由于其他進(jìn)程占用了過多的內(nèi)存。
3、Memory Grants Outstanding
- 含義:等待分配給查詢的內(nèi)存請求數(shù)量。
- 重要性:此數(shù)字較大時,意味著有大量并發(fā)查詢正在爭奪有限的內(nèi)存資源,可能導(dǎo)致查詢延遲增加。長期保持高位可能需要調(diào)整最大內(nèi)存設(shè)置或者優(yōu)化查詢。
4、Page Life Expectancy (PLE)
- 含義:一個頁面在緩沖池中停留而不被移出的平均時間(以秒為單位)。雖然PLE不是
DBCC MEMORYSTATUS直接輸出的字段,但可以通過sys.dm_os_performance_counters視圖獲取。 - 重要性:PLE是一個重要的內(nèi)存健康指標(biāo)。較高的PLE值通常表示內(nèi)存充足,而較低的PLE值(例如小于300秒)可能指示內(nèi)存壓力,因?yàn)轫撁姹活l繁地從緩存中移除。
5、Available Physical Memory (KB)
- 含義:當(dāng)前可用的物理內(nèi)存量(以千字節(jié)為單位),即未被占用或預(yù)留的內(nèi)存。
- 重要性:了解系統(tǒng)的整體內(nèi)存情況,幫助判斷是否有足夠的空閑內(nèi)存供SQL Server和其他應(yīng)用程序使用。低可用內(nèi)存可能導(dǎo)致操作系統(tǒng)開始交換內(nèi)存到磁盤,從而降低性能。
6、Available Paging File (KB)
- 含義:當(dāng)前可用的頁面文件空間量(以千字節(jié)為單位)。
- 重要性:盡管SQL Server盡量避免使用頁面文件,但如果物理內(nèi)存不足,它仍會依賴頁面文件。因此,確保有足夠的頁面文件空間也很重要,但應(yīng)盡量減少對它的依賴。
7、Percent of Committed Memory in WS
- 含義:已提交的內(nèi)存中位于工作集內(nèi)的百分比。
- 重要性:這個比率有助于理解有多少已分配給SQL Server的內(nèi)存正被積極使用。高比例表明大部分內(nèi)存都在活躍使用中,而低比例可能暗示有未充分利用的內(nèi)存或存在過多的內(nèi)存分配。
8、System Physical Memory Low
- 含義:一個狀態(tài)標(biāo)志,表示系統(tǒng)物理內(nèi)存處于“低”水平。
- 重要性:當(dāng)此標(biāo)志為真時,意味著系統(tǒng)物理內(nèi)存接近耗盡,可能需要采取行動來緩解內(nèi)存壓力,比如增加物理內(nèi)存、優(yōu)化查詢或調(diào)整SQL Server的最大內(nèi)存設(shè)置。
9、Page Faults
- 含義:頁面錯誤的數(shù)量,指的是嘗試訪問不在物理內(nèi)存中的頁面而觸發(fā)的操作系統(tǒng)加載頁面的行為次數(shù)。
- 重要性:頻繁的頁面錯誤(特別是硬頁面錯誤)可能指示內(nèi)存不足,因?yàn)槊看雾撁驽e誤都會導(dǎo)致磁盤I/O操作,這將顯著影響性能。
10、Memory Grants Pending
- 含義:已提交但尚未完成處理的內(nèi)存請求隊(duì)列長度。
- 重要性:如果這個值非零,意味著有內(nèi)存請求在等待處理,這可能會延遲查詢執(zhí)行。長期存在的非零值可能指向內(nèi)存爭用問題。
11、Lock Pages in Memory Usage (KB)
- 含義:如果啟用了“鎖頁”選項(xiàng),則該值表示用于鎖定到物理內(nèi)存中的頁數(shù)量(以千字節(jié)為單位)。
- 重要性:啟用“鎖頁”可以防止SQL Server的工作集被換出到磁盤,提高性能。但是,這也減少了操作系統(tǒng)可用于其他進(jìn)程的物理內(nèi)存。
12、Large Pages Allocated (KB)
- 含義:如果啟用了大頁支持,則顯示已分配的大頁內(nèi)存量(以千字節(jié)為單位)。
- 重要性:大頁可以減少TLB(Translation Lookaside Buffer)丟失并提升性能。對于大型數(shù)據(jù)倉庫或OLAP環(huán)境,啟用大頁支持可能會帶來性能改進(jìn)。
這些關(guān)鍵指標(biāo)提供了關(guān)于SQL Server內(nèi)存使用情況的全面視圖,并且對于診斷性能問題非常有價值。通過定期監(jiān)控這些指標(biāo),可以及時發(fā)現(xiàn)潛在的問題,并采取適當(dāng)?shù)拇胧﹣韮?yōu)化SQL Server的性能。此外,結(jié)合動態(tài)管理視圖(DMVs),如sys.dm_os_memory_clerks、sys.dm_exec_query_memory_grants等,以及性能計(jì)數(shù)器,可以獲得更加詳細(xì)的洞察力,從而更好地管理和調(diào)優(yōu)SQL Server實(shí)例。
緩存清除命令
-- 臨時清除緩存命令
DBCC FREEPROCCACHE --清除存儲過程相關(guān)的緩存
DBCC REESESSIONCACHE --清除會話緩存
DBCC FREESYSTEMCACHE('All') --清除系統(tǒng)緩存
DBCC DROPCLEANBUFFERS --清除所有緩存以上命令雖然會清除掉現(xiàn)有緩存,為新的緩存騰出空間,但是Sql server并不會因此釋放掉已經(jīng)占用的內(nèi)存。Sql
Server并沒有提供任何命令允許我們釋放不用到的內(nèi)存。因此我們只能通過動態(tài)調(diào)整Sql Server可用的物理內(nèi)存設(shè)
置來強(qiáng)迫它釋放內(nèi)存。
如果想讓 Sql Server 主動釋放 占用并空閑的內(nèi)存空間,可以設(shè)置Sql Server占用內(nèi)存的上限,就會讓Sql server在
內(nèi)存上限范圍內(nèi),主動清除臟數(shù)據(jù)替換成熱數(shù)據(jù)。因此還得如下操作
三、設(shè)置內(nèi)存最大占用值
設(shè)置方式:
從自帶的studio 連接,,在數(shù)據(jù)庫服務(wù)器名稱上點(diǎn)擊【右鍵】,選擇【屬性】,然后,找到【內(nèi)存】選項(xiàng),在右邊的【使用AWE分配內(nèi)存】(sqlServer64的應(yīng)該不用勾)左邊把對勾打上。在最大服務(wù)器內(nèi)存(MB)上填入適當(dāng)?shù)拇笮。ň唧w填多大,肯定不能超過計(jì)算機(jī)的物理內(nèi)存,建議控制在60%-75%),設(shè)置成功后重啟

四、 其他
結(jié)果集圖片:執(zhí)行 DBCC MemoryStatus

到此這篇關(guān)于SQL Server 內(nèi)存占用高分析及解決辦法(超詳細(xì))的文章就介紹到這了,更多相關(guān)SQL Server 內(nèi)存占用高內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SQL?server數(shù)據(jù)庫log日志過大占用內(nèi)存大的解決辦法
- SQL server內(nèi)存問題排查方案
- SQL?Server內(nèi)存機(jī)制詳解
- sql server學(xué)習(xí)基礎(chǔ)之內(nèi)存初探
- SQL Server 2008 R2占用cpu、內(nèi)存越來越大的兩種解決方法
- SqlServer如何通過SQL語句獲取處理器(CPU)、內(nèi)存(Memory)、磁盤(Disk)以及操作系統(tǒng)相關(guān)信息
- SQL語句實(shí)現(xiàn)查詢SQL Server內(nèi)存使用狀況
- 揭秘SQL Server 2014有哪些新特性(1)-內(nèi)存數(shù)據(jù)庫
- 淺談SQL Server 對于內(nèi)存的管理[圖文]
- SQL Server 數(shù)據(jù)頁緩沖區(qū)的內(nèi)存瓶頸分析
相關(guān)文章
sql 存儲過程分頁代碼 支持億萬龐大數(shù)據(jù)量
sql 存儲過程分頁代碼 支持億萬龐大數(shù)據(jù)量,需要的朋友可以參考下。2011-09-09
SQL Server誤區(qū)30日談 第7天 一個實(shí)例多個鏡像和日志傳送延遲
這個誤區(qū)就有點(diǎn)老生常談了。每一個主體服務(wù)器只允許一個鏡像服務(wù)器。如果你希望存在多個主體服務(wù)器的副本,那么請使用事務(wù)日志傳送,事務(wù)日志傳送允許針對每一個主體存在多個輔助實(shí)例2013-01-01
把數(shù)據(jù)批量插入具有Identity列的表的方法
把數(shù)據(jù)批量插入具有Identity列的表的方法。2009-08-08
SQLServer行列互轉(zhuǎn)實(shí)現(xiàn)思路(聚合函數(shù))
這篇文章主要為大家詳細(xì)介紹了SQLServer行列互轉(zhuǎn)實(shí)現(xiàn)思路,使用聚合函數(shù)pivot/unpivot實(shí)現(xiàn)行列互轉(zhuǎn),感興趣的小伙伴們可以參考一下2016-03-03
大數(shù)據(jù)量分頁存儲過程效率測試附測試代碼與結(jié)果
在項(xiàng)目中,我們經(jīng)常遇到或用到分頁,那么在大數(shù)據(jù)量(百萬級以上)下,哪種分頁算法效率最優(yōu)呢?我們不妨用事實(shí)說話。2010-07-07

