Answers:
这是一些很好的解释。看看吧。
http://www.mssqltips.com/tip.asp?tip=1360
CHECKPOINT;
GO
DBCC DROPCLEANBUFFERS;
GO
从链接的文章中:
如果所有性能测试都是在SQL Server中进行的,则最好的方法可能是发出CHECKPOINT,然后发出DBCC DROPCLEANBUFFERS命令。尽管CHECKPOINT进程是SQL Server中的一个自动内部系统进程,并且会定期发生,但是发出此命令以将当前数据库的所有脏页都写入磁盘并清理缓冲区很重要。然后,可以执行DBCC DROPCLEANBUFFERS命令以从缓冲池中删除所有缓冲区。
DBCC FREEPROCCACHE;
使用它来仔细清除计划缓存。释放计划缓存会导致例如重新编译存储过程,而不是从缓存中重新使用它。这可能会导致查询性能突然暂时下降。
“ DBCC执行完成。如果DBCC打印了错误消息,请与系统管理员联系。”
DBCC FREEPROCCACHE WITH NO_INFOMSGS;
DBCC FREESYSTEMCACHE ('SQL Plans');
DBCC FREESYSTEMCACHE ('SQL Plans', 'LimitedIOPool');
DBCC FREEPROCCACHE ('LimitedIOPool');
-- 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);
USE AdventureWorks2014;
GO
-- New in SQL Server 2016 and SQL Azure
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
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);
虽然这个问题有点老了,但这可能还是有帮助的。我遇到了类似的问题,使用下面的选项对我有所帮助。不确定这是否是永久解决方案,但目前正在修复。
OPTION (OPTIMIZE FOR UNKNOWN)
然后您的查询将像这样
select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
需要注意的是既不DBCC DROPCLEANBUFFERS;
也不DBCC FREEPROCCACHE;
在SQL Azure中/ SQL数据仓库的支持。
但是,如果需要在SQL Azure中重置计划缓存,则可以更改查询中的表之一(例如,只需添加然后删除一列),这会产生从缓存中删除计划的副作用。 。
我个人这样做是为了测试查询性能而无需处理缓存的计划。