如何清除SQL Server查询缓存?


199

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

SELECT * 
FROM Table 
WHERE Col = 'someval'

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

如何获得SQL Server 2005不使用任何缓存的结果?我试过跑步

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE

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


Answers:


259

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

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

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO

从链接的文章中:

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


14
一个可能还包括DBCC FREEPROCCACHE
jaraics 2011年

1
当使用dropcleanbuffers时,这适用于连接到数据库的每个人还是仅适用于该用户?
克里斯·诺贝尔斯

1
@Kris:DBCC DROPCLEANBUFFERS,从缓冲池中删除所有干净的缓冲区。这是查询性能调整中的必要步骤,不应在实时SQL Server上使用它。
2015年

这对于SQL Server效果很好,但是请注意,这在SQL Azure中不起作用-我在下面发布了替代解决方案来处理SQL Azure方案。
MSC

1
好的,这是唯一实际有效的命令,它尝试了许多其他命令却没有起作用。
加百利·罗德里格斯

15

八种清除计划缓存的方法

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

DBCC FREEPROCCACHE;

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

2.刷新整个实例的计划缓存,并隐藏常规完成消息

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

DBCC FREEPROCCACHE WITH NO_INFOMSGS;

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

DBCC FREESYSTEMCACHE ('SQL Plans');

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

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

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

DBCC FREEPROCCACHE ('LimitedIOPool');

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

-- 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);

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

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

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

USE AdventureWorks2014;
GO

-- Run a stored procedure or query
EXEC dbo.uspGetEmployeeManagers 9;

-- Find the plan handle for that query 
-- OPTION (RECOMPILE) keeps this query from going into the plan cache
SELECT cp.plan_handle, cp.objtype, cp.usecounts, 
DB_NAME(st.dbid) AS [DatabaseName]
FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st 
WHERE OBJECT_NAME (st.objectid)
LIKE N'%uspGetEmployeeManagers%' OPTION (RECOMPILE); 

-- Remove the specific query plan from the cache using the plan handle from the above query 
DBCC FREEPROCCACHE (0x050011007A2CC30E204991F30200000001000000000000000000000000000000000000000000000000000000);
 

来源1 2 3


9

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

OPTION (OPTIMIZE FOR UNKNOWN)

然后您的查询将像这样

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

1
关键字“ OPTION”附近的语法不正确。或'UNKNOWN'附近的语法不正确。
pabrams

1
@pabrams这些遵循您的查询(作为查询的一部分),例如:select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
Mark Avenius

1
只要绝对确保您不会在生产代码中无意中放入这样的内容-因为这可能会导致重大问题。
迈克尔·坎贝尔

4
为未知优化不会忽略缓存的计划。而是在生成计划时,它指示SQL Server选择“独立于任何[自动]参数化的平均分布值”来确定要创建的计划,这将导致计划在非均匀统计数据中可能更加一致。选项(RECOMPILE)会创建一个计划,但不会以其他方式清除/释放数据缓存-这通常会生成更理想的计划,但会以计划再生和计划缓存成本为代价。
user2864740 '16

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

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

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


3

需要注意的是既不DBCC DROPCLEANBUFFERS;也不DBCC FREEPROCCACHE;在SQL Azure中/ SQL数据仓库的支持。

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

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

有关SQL Azure过程缓存的更多详细信息,请单击此处


这对我不起作用,因此计划没有改变。请在这里查看stackoverflow.com/questions/46987785/…–
Meneghino
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.