你的位置:首页 > 数据库

[数据库]DBCC DROPCLEANBUFFERS失效了?


原文出处: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_descriptorsGROUP BY [database_id]) AS [buffers]ORDER BY [DatabaseName]GO