文章出處
文章列表
原文出處:http://www.sqlskills.com/blogs/paul/when-dbcc-dropcleanbuffers-doesnt-work/
DBCC DROPCLEANBUFFERS是用來清除內存中的數據緩存,一般我們在做性能調優時為了方便看到一條語句的執行時間和物理IO消耗,都會在語句執行前執行一遍DBCC DROP CLEANBUFFERS。
但,這招并不是時時很靈。
有人或許就碰到這種現象,即使執行了DBCC DROPCLEANBUFFERS,但在SSMS的輸出信息里面還是看不到物理讀,這條語句還是從內存中讀取的數據(邏輯讀)。
你會很詫異,“不是已經將內存中的緩沖清空了嗎,怎么沒有物理讀呢?出現這種現象是不是DBCC DROPCLEANBUFFERS失效了呢?”
不是。DROP CLEANBUFFERS確實是可以用來清除內存中的數據緩存,但只能清除掉clean狀態的緩存頁面,相對的,如果這些頁面是臟頁,也就是內存中已被修改且還未同步到磁盤的數據頁面,那么它是無法從緩存中清除的,這是為了性能的考慮。
所以當你遇到DROP CLEANBUFFERS“失效”時,嘗試手動同步下內存和磁盤中的數據頁面,執行:
checkpoint
你也可以通過如下語句查看當前內存中clean頁面和臟頁的數量和大小:
SELECT *, [DirtyPageCount] * 8 / 1024 AS [DirtyPageMB], [CleanPageCount] * 8 / 1024 AS [CleanPageMB] FROM (SELECT (CASE WHEN ([database_id] = 32767) THEN N'Resource Database' ELSE DB_NAME ([database_id]) END) AS [DatabaseName], SUM (CASE WHEN ([is_modified] = 1) THEN 1 ELSE 0 END) AS [DirtyPageCount], SUM (CASE WHEN ([is_modified] = 1) THEN 0 ELSE 1 END) AS [CleanPageCount] FROM sys.dm_os_buffer_descriptors GROUP BY [database_id]) AS [buffers] ORDER BY [DatabaseName] GO
文章列表
全站熱搜