我怎样才能清除SQL Server查询caching?
我有一个简单的查询运行在SQL Server 2005上
SELECT * FROM Table WHERE Col = 'someval'
我第一次执行查询可能需要> 15 secs
。 随后的执行在< 1 sec
内返回。
我怎样才能让SQL Server 2005不使用任何caching的结果? 我试过跑步
DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE
但是这似乎对查询速度没有影响(仍然< 1 sec
)。
这是一些很好的解释。 看看它。
http://www.mssqltips.com/tip.asp?tip=1360
CHECKPOINT; GO DBCC DROPCLEANBUFFERS; GO
从链接的文章:
如果所有性能testing都是在SQL Server中进行的,最好的办法可能是发出一个CHECKPOINT,然后发出DBCC DROPCLEANBUFFERS命令。 尽pipeCHECKPOINT进程是SQL Server中的一个自动内部系统进程,并定期发生,但发出此命令将当前数据库的所有脏页写入磁盘并清理缓冲区非常重要。 然后,可以执行DBCC DROPCLEANBUFFERS命令以从缓冲池中删除所有缓冲区。
虽然这个问题有点旧了,但这仍然有帮助。 我遇到类似的问题,使用下面的选项帮助了我。 不知道这是否是一个永久的解决scheme,但现在正在解决它。
OPTION (OPTIMIZE FOR UNKNOWN)
那么你的查询将是这样的
select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
EXEC sys.sp_configure N'max server memory (MB)', N'2147483646' GO RECONFIGURE WITH OVERRIDE GO
您指定的服务器内存的值不重要,只要它与当前的值不同即可。
顺便说一句,导致加速的事情不是查询caching,而是数据caching。
八种不同的方式来清除计划caching
1.从计划caching中删除整个实例的所有元素
DBCC FREEPROCCACHE;
使用它来仔细清除计划caching。 释放计划caching会导致(例如)重新编译存储过程,而不是从caching中重用。 这可能会导致查询性能突然暂时下降。
2.刷新整个实例的计划caching并取消常规完成消息
“DBCC执行已完成,如果DBCC打印错误消息,请联系您的系统pipe理员。
DBCC FREEPROCCACHE WITH NO_INFOMSGS;
3.刷新整个实例的临时和准备计划caching
DBCC FREESYSTEMCACHE ('SQL Plans');
4.为一个资源池刷新即席和准备计划caching
DBCC FREESYSTEMCACHE ('SQL Plans', 'LimitedIOPool');
5.刷新整个计划caching中的一个资源池
DBCC FREEPROCCACHE ('LimitedIOPool');
6.从计划caching中删除一个数据库的所有元素(在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);
清除当前数据库的计划caching
USE AdventureWorks2014; GO -- New in SQL Server 2016 and SQL Azure ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
8.从caching中删除一个查询计划
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
请注意,无论是DBCC DROPCLEANBUFFERS;
也没有DBCC FREEPROCCACHE;
在SQL Azure / SQL数据仓库中受支持。
但是,如果您需要重置SQL Azure中的计划caching,则可以更改查询中的某个表(例如,只需添加然后删除一列),这将具有从caching中删除计划的副作用。
我个人这样做是为了testing查询性能而不必处理caching计划。
更多关于SQL Azure过程caching的细节在这里