如何从SQL Server的缓存中清除表?


10

我的数据库中有一些表不应缓存。

如何告诉SQL Server不要缓存表的页面,或者如何从缓存中刷新单个表?

清空所有缓存不是一种选择。

我正在使用SQL Server 2008和SQL Server 2008 R2。


4
您基于什么基础决定不应缓存表?

3
如果您的表正在缓存,则将对其进行查询。如果不经常访问它们,则SQL Server内存管理器将在需要的时间优先于其他对象将其冲洗掉。您的目标是什么?
约翰·桑索姆

4
@John-不知道OP的目标是什么,但是有时候这会很有用。例如,对大型表进行一次性扫描而无需刷新缓冲池。

3
某些原因:低优先级表,与sql server在同一台机器上的iis / rs,电源使用情况等。最重要的是,某些表是关于应用程序性能的低优先级表,可以从磁盘上安全地读取每当他们被访问。通过将这些表保留在缓冲池之外,内存分析将变得更加容易。
Catalin Adler 2011年

1
@ user973156:您的代码和设计是否很好,您现在只能猜测第二个SQL Server才能使事情变得更好?
gbn

Answers:


12

没有办法做到这一点。

DBCC DROPCLEANBUFFERS不接受特定数据库或对象的任何参数。在内部,SQL Server可以在数据库级别执行此操作,但是,当数据库为AUTO_CLOSEd 时,将从缓冲区缓存中删除所有相应的页面。

同样,SQL Server在内部可以标记某些页面,以使它们成为惰性编写器启动的第一个页面。DMV使用此方法sys.dm_db_index_physical_stats来避免刷新本文中提到的缓冲池,但是此功能并未以任何方式向我们公开(即使在进行一次性扫描时指定相同的功能可能很有用)例如一张大桌子)。


7

您不能指定不应缓存特定的表。是什么使您认为不希望将表存储在缓存中?

SQL Server在缓冲池中执行其所有正常操作,因此,如果您能够告诉SQL Server不要将表加载到缓存中,则任何正常DML操作都无法访问该表。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.