SQL Server 採「有多少用多少」策略,除非系統可用記憶體極低(約剩 4MB),否則不主動釋放。佔用記憶體主要作為資料快取(Data Cache)與程序快取(Procedure Cache)。
DBCC FREEPROCCACHE -- 清除程序快取
DBCC FREESESSIONCACHE -- 清除會話快取
DBCC FREESYSTEMCACHE('All') -- 清除所有系統快取
DBCC DROPCLEANBUFFERS -- 清除乾淨資料頁快取
以上指令僅清除快取內容,SQL Server 進程佔用的實體記憶體不會歸還作業系統。
-- 查看目前設定
SELECT * FROM sys.dm_os_performance_counters
WHERE counter_name IN ('Target Server Memory (KB)','Total Server Memory (KB)');
-- 設定最小/最大記憶體
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'max server memory', 256; -- 限制 256 MB
RECONFIGURE;
-- 待記憶體釋放後恢復
EXEC sp_configure 'max server memory', 2147483647; RECONFIGURE;
EXEC sp_configure 'show advanced options', 0; RECONFIGURE;
CREATE PROC reclaimmemory AS
BEGIN
DBCC FREEPROCCACHE;
DBCC FREESESSIONCACHE;
DBCC FREESYSTEMCACHE('All');
DBCC DROPCLEANBUFFERS;
EXEC sp_configure 'max server memory', 256; EXEC('RECONFIGURE');
WAITFOR DELAY '00:00:05';
EXEC sp_configure 'max server memory', 2147483647; EXEC('RECONFIGURE');
END
執行 reclaimmemory 即可強制釋放記憶體。