我有一个针对SQL Server 2005运行的简单查询
SELECT *
FROM Table
WHERE Col = 'someval'
我第一次执行查询时可以> 15 secs
。后续执行返回< 1 sec
。
如何让SQL Server 2005不使用任何缓存结果?我试过了
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
但这似乎对查询速度没有影响(仍为< 1 sec
)。
答案 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)
Result<Harsh, ConfigError>
使用此选项仔细清除计划缓存。例如,释放计划高速缓存会导致重新编译存储过程,而不是从高速缓存中重用。这可能会导致查询性能突然暂时下降。
“DBCC执行完成。如果DBCC打印错误消息,请联系您的系统管理员。”
DBCC FREEPROCCACHE;
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;
答案 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中重置计划缓存,则可以更改查询中的一个表(例如,只需添加然后删除一列),这将产生删除计划的副作用来自缓存。
我个人这样做是为了测试查询性能而不必处理缓存计划。