[SQL SERVER][Performance] 那些操作會清除Cache?
Buffer Pool 會快取相關已經讀取的data or index page..等 ,
這樣處理可以最小化I/O讀取操作(都由記憶體取得),
所以一般來說我不會隨便手動清除生產資料庫的Buffer Pool(交給SQL SERVER 自行管理),
反而我甚至還會把相關工作負載提前載入到Buffer Pool,
以利讓前端系統直接從記憶體取得資料。
相信大家一定都聽過,重新啟動SQL SERVER Service會清空DMV 統計、執行計畫..等,
但其實還有其他操作也會清除快取,下面測試整理一下。
目前Buffer Pool所使用記憶體大小
SELECT count(*) * 8 / 1024 AS '記憶體大小(Mb)',
sum (CONVERT (bigint, free_space_in_bytes)) / (1024) AS '空閒記憶體(Kb)' ,
CASE database_id
WHEN 32767 THEN 'ResourceDb'
ELSE db_name(database_id)
END AS Database_name
FROM sys.dm_os_buffer_descriptors
where db_name(database_id) ='mydemo'
GROUP BY db_name(database_id) ,database_id
ORDER BY '記憶體大小(Mb)' DESC;
1.Change Database State
alter database mydemo set read_only|offline|read_write
再次查詢Buffer Pool所使用記憶體大小
可以看到被清除了。
ps:變更 online 不會清除。
2.Restore Database
很多人誤以為執行還原資料庫,會連同相關統計資料、快取資料..等一起還原,
但其實不然(反而清除該資料庫Buffer Pool),如果沒有事先載入相關工作負載和更新統計資料的話,
往往還原後一開始都會覺得查詢資料庫效能不佳,
因為相關快取物件已經被清空了(執行計畫、data or index page...)。
3.Detach Database
卸載資料庫也會連帶清空該資料庫Buffer Pool,主要原因和第2點差不多。
4.變更執行個體組態選項
需要注意要重新啟動的選項,因為重新啟動將清空Buffer Pool。
(擷取部份)。
參考