MS SQL Server系統(tǒng)內(nèi)存管理在沒(méi)有配置內(nèi)存最大值析苫,很多時(shí)候我們會(huì)發(fā)現(xiàn)運(yùn)行SQL Server的系統(tǒng)內(nèi)存往往居高不下诡挂。這是由于他對(duì)于內(nèi)存使用的策略是有多少閑置的內(nèi)存就占用多少搏熄,直到內(nèi)存使用慮達(dá)到系統(tǒng)峰值時(shí)(預(yù)留內(nèi)存根據(jù)系統(tǒng)默認(rèn)預(yù)留使用為準(zhǔn)理逊,至少4M)捻激,才會(huì)清除一些緩存釋放少量的內(nèi)存為新的緩存騰出空間。
這些內(nèi)存一般都是SQL Server運(yùn)行時(shí)候用作緩存的灯谣,例如你運(yùn)行一個(gè)select語(yǔ)句, 執(zhí)行個(gè)存儲(chǔ)過(guò)程蛔琅,調(diào)用函數(shù)胎许;
1.數(shù)據(jù)緩存:執(zhí)行個(gè)查詢語(yǔ)句,SQL Server會(huì)將相關(guān)的數(shù)據(jù)頁(yè)(SQL Server操作的數(shù)據(jù)都是以頁(yè)為單位的)加載到內(nèi)存中來(lái)罗售, 下一次如果再次請(qǐng)求此頁(yè)的數(shù)據(jù)的時(shí)候辜窑,就無(wú)需讀取磁盤了,大大提高了速度寨躁。
2.執(zhí)行命令緩存:在執(zhí)行存儲(chǔ)過(guò)程穆碎,自定函數(shù)時(shí),SQL Server需要先二進(jìn)制編譯再運(yùn)行职恳,編譯后的結(jié)果也會(huì)緩存起來(lái)所禀, 再次調(diào)用時(shí)就無(wú)需再次編譯方面。
在我們執(zhí)行完相應(yīng)的查詢語(yǔ)句,或存儲(chǔ)過(guò)程色徘,如果我們不在需要這些緩存恭金,我可以將它清除,DBCC管理命令緩存清除如下:
SQL:
--1.清除存儲(chǔ)過(guò)程緩存
DBCC FREEPROCCACHE
--注:方便記住關(guān)鍵字 FREEPROCCACHE 可以拆解成 FREE(割舍褂策,清除) PROC(存儲(chǔ)過(guò)程關(guān)鍵字簡(jiǎn)寫(xiě))蔚叨,CACHE(緩存)
--2.清除會(huì)話緩存
DBCC FREESESSIONCACHE
--注: FREE(割舍,清除) SESSION(會(huì)話) CACHE(緩存)
--3.清除系統(tǒng)緩存
DBCC FREESYSTEMCACHE('All')
--注:FREE SYSTE MCACHE
--4.清除所有緩存
DBCC DROPCLEANBUFFERS
--注: DROP CLEAN BUFFERS
雖然我們已經(jīng)清除了緩存辙培,但是SQL并未釋放相應(yīng)占用的內(nèi)存蔑水。 它只是騰出新的空間為之后所執(zhí)行腳本所用。SQL Server 并沒(méi)有提供任何命令允許我們釋放不用到的內(nèi)存扬蕊。因此我們只能通過(guò)動(dòng)態(tài)調(diào)整 SQL Server可用的物理內(nèi)存設(shè)置來(lái)強(qiáng)迫它釋放內(nèi)存搀别。
操作原理是調(diào)整內(nèi)存配置大小。手動(dòng)操作方法:
1.打開(kāi)SQL Server Management(企業(yè)管理器);
2.打開(kāi)SQL Server實(shí)例的屬性面板;
3.找到內(nèi)存設(shè)置尾抑,改變其中的最大服務(wù)器內(nèi)存使用即可 歇父。
使用腳本操作:
--1.強(qiáng)制釋放內(nèi)存
CREATE procedure [dbo].ClearMemory
as begin
--2.清除所有緩存
DBCC DROPCLEANBUFFERS
--3.打開(kāi)高級(jí)配置
exec sp_configure 'show advanced options', 1
--4.設(shè)置最大內(nèi)存值,清除現(xiàn)有緩存空間
exec sp_configure 'max server memory', 256
EXEC ('RECONFIGURE')
--5.設(shè)置等待時(shí)間
WAITFOR DELAY '00:00:01'
--6.重新設(shè)置最大內(nèi)存值
EXEC sp_configure 'max server memory', 4096
EXEC ('RECONFIGURE')
--7.關(guān)閉高級(jí)配置
exec sp_configure 'show advanced options',0
GO
下面提供內(nèi)存查看功能的一些腳本語(yǔ)句:
--1.內(nèi)存使用情況
SELECT * FROM sys.dm_os_performance_counters
WHERE counter_name IN ('Target Server Memory (KB)','Total Server Memory (KB)')
-- 2.內(nèi)存狀態(tài)
DBCC MemoryStatus
--3.查看最小最大內(nèi)存
SELECT configuration_id as id,
name as 名稱,
minimum as 配置最小值,
maximum as 最大值,
is_dynamic as 是否動(dòng)態(tài)值,
is_advanced as 是否優(yōu)先,
value_in_use AS 運(yùn)行值,
description as 描述
FROM sys.configurations