如何清除SQL Server查询缓存?

Pau*_*ulB 190 sql-server caching

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

SELECT * 
FROM Table 
WHERE Col = 'someval'
Run Code Online (Sandbox Code Playgroud)

我第一次执行查询可以采取> 15 secs.后续执行重新进入< 1 sec.

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

DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
Run Code Online (Sandbox Code Playgroud)

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

Saa*_*aar 247

这里有一些很好的解释.看看吧.

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

CHECKPOINT; 
GO 
DBCC DROPCLEANBUFFERS; 
GO
Run Code Online (Sandbox Code Playgroud)

来自链接的文章:

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

  • 其中一个还包括DBCC FREEPROCCACHE (14认同)
  • 当使用 dropcleanbuffers 时,这适用于连接到数据库的每个人还是仅适用于该用户? (2认同)

Som*_*luk 13

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

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

DBCC FREEPROCCACHE;
Run Code Online (Sandbox Code Playgroud)

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

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

"DBCC执行完成.如果DBCC打印出错误消息,请联系您的系统管理员."

DBCC FREEPROCCACHE WITH NO_INFOMSGS;
Run Code Online (Sandbox Code Playgroud)

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

DBCC FREESYSTEMCACHE ('SQL Plans');
Run Code Online (Sandbox Code Playgroud)

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

DBCC FREESYSTEMCACHE ('SQL Plans', 'LimitedIOPool');
Run Code Online (Sandbox Code Playgroud)

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

DBCC FREEPROCCACHE ('LimitedIOPool');
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

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

USE AdventureWorks2014;
GO
-- New in SQL Server 2016 and SQL Azure
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

来源1 2 3


Ton*_*llo 9

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

OPTION (OPTIMIZE FOR UNKNOWN)
Run Code Online (Sandbox Code Playgroud)

然后你的查询将是这样的

select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
Run Code Online (Sandbox Code Playgroud)

  • 对于UNKNOWN的OPTIMIZE确实*不*忽略缓存计划.相反,在生成计划时,它指示SQL服务器选择"平均分布值,独立于任何[自动]参数化"以决定要创建的计划 - 这会导致计划在非统一统计信息中更加一致.OPTION(RECOMPILE)创建一个*new*计划,但不会清理/释放数据缓存 - 这通常会以计划重新生成和计划缓存成本为代价生成更理想的计划. (4认同)
  • 关键字“OPTION”附近的语法不正确。或 'UNKNOWN' 附近的语法不正确。 (2认同)

MSC*_*MSC 7

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

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

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

在此处查看有关 SQL Azure 过程缓存的更多详细信息


eri*_*len 6

EXEC sys.sp_configure N'max server memory (MB)', N'2147483646'
GO
RECONFIGURE WITH OVERRIDE
GO
Run Code Online (Sandbox Code Playgroud)

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

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