[SQL SERVER][Performance] 那些操作會清除Cache?

[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;

 

image

 

1.Change Database State


alter database mydemo set read_only|offline|read_write


再次查詢Buffer Pool所使用記憶體大小

 

image

可以看到被清除了。

ps:變更 online 不會清除。

 

 

2.Restore Database

很多人誤以為執行還原資料庫,會連同相關統計資料、快取資料..等一起還原,

但其實不然(反而清除該資料庫Buffer Pool),如果沒有事先載入相關工作負載和更新統計資料的話,

往往還原後一開始都會覺得查詢資料庫效能不佳,

因為相關快取物件已經被清空了(執行計畫、data or index page...)。

 

 

3.Detach Database

卸載資料庫也會連帶清空該資料庫Buffer Pool,主要原因和第2點差不多。

 

 

4.變更執行個體組態選項

需要注意要重新啟動的選項,因為重新啟動將清空Buffer Pool。

image

(擷取部份)。

 

 

 

參考

[SQL SERVER][TSQL]查詢緩衝區資料頁所使用記憶體大小

設定伺服器組態選項

設定資料庫選項

緩衝區管理

記憶體架構

SQL Server 物件使用記憶體的規格