文章出處

原文出處: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

文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()