如何清除SQL Server查询缓存?

时间:2009-12-09 10:37:43

标签: sql-server caching

我有一个针对SQL Server 2005运行的简单查询

SELECT * 
FROM Table 
WHERE Col = 'someval'

我第一次执行查询时可以> 15 secs。后续执行返回< 1 sec

如何让SQL Server 2005不使用任何缓存结果?我试过了

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

但这似乎对查询速度没有影响(仍为< 1 sec)。

5 个答案:

答案 0 :(得分:242)

这是一个很好的解释。看看吧。

http://www.mssqltips.com/tip.asp?tip=1360

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO

来自链接文章:

  

如果所有性能测试都在SQL Server中进行,最好的方法可能是发出CHECKPOINT,然后发出DBCC DROPCLEANBUFFERS命令。虽然CHECKPOINT进程是SQL Server中的自动内部系统进程并且定期发生,但是发出此命令以将当前数据库的所有脏页写入磁盘并清理缓冲区非常重要。然后可以执行DBCC DROPCLEANBUFFERS命令从缓冲池中删除所有缓冲区。

答案 1 :(得分:9)

虽然问题有点老,但这可能仍有帮助。我遇到了类似的问题,使用下面的选项帮助了我。不确定这是否是一个永久的解决方案,但它现在正在修复它。

OPTION (OPTIMIZE FOR UNKNOWN)

然后你的查询将是这样的

select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)

答案 2 :(得分:8)

清除计划缓存的八种不同方法

1。从整个实例的计划缓存中删除所有元素

Result<Harsh, ConfigError>

使用此选项仔细清除计划缓存。例如,释放计划高速缓存会导致重新编译存储过程,而不是从高速缓存中重用。这可能会导致查询性能突然暂时下降。

2。刷新整个实例的计划缓存并禁止常规完成消息

“DBCC执行完成。如果DBCC打印错误消息,请联系您的系统管理员。”

DBCC FREEPROCCACHE;

3。刷新整个实例的临时和准备好的计划缓存

DBCC FREEPROCCACHE WITH NO_INFOMSGS;

4。刷新一个资源池的临时和准备好的计划缓存

DBCC FREESYSTEMCACHE ('SQL Plans');

5。刷新一个资源池的整个计划缓存

DBCC FREESYSTEMCACHE ('SQL Plans', 'LimitedIOPool');

6。从一个数据库的计划缓存中删除所有元素(在SQL Azure中不起作用)

DBCC FREEPROCCACHE ('LimitedIOPool');

7。清除当前数据库的计划缓存

-- Get DBID from one database name first
DECLARE @intDBID INT;
SET @intDBID = (SELECT [dbid] 
                FROM master.dbo.sysdatabases 
                WHERE name = N'AdventureWorks2014');

DBCC FLUSHPROCINDB (@intDBID);

8。从缓存中删除一个查询计划

USE AdventureWorks2014;
GO
-- New in SQL Server 2016 and SQL Azure
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;

来源1 2 3

答案 3 :(得分:5)

EXEC sys.sp_configure N'max server memory (MB)', N'2147483646'
GO
RECONFIGURE WITH OVERRIDE
GO

您为服务器内存指定的值并不重要,只要它与当前值不同。

顺便说一句,导致加速的事情不是查询缓存,而是数据缓存。

答案 4 :(得分:3)

请注意,SQL Azure / SQL数据仓库中不支持DBCC DROPCLEANBUFFERS;DBCC FREEPROCCACHE;

但是,如果您需要在SQL Azure中重置计划缓存,则可以更改查询中的一个表(例如,只需添加然后删除一列),这将产生删除计划的副作用来自缓存。

我个人这样做是为了测试查询性能而不必处理缓存计划。

More details about SQL Azure Procedure Cache here