2010-10-26 122 views
0

存储过程在首次使用时编译。如何强制存储过程进行预缓存并保留在内存中?

有选项清除缓存:

DBCC FREEPROCCACHE 
DBCC DROPCLEANBUFFERS 
--To Verify whether the cache is emptied 
--DBCC PROCCACHE 

或重新编译或减少重新编译。

但是是否有可能强制将经常使用的存储过程的执行计划预先缓存并保留在内存中?

我知道如何在ADO.NET中做到这一点,即从SQL Server之外,但这个问题是如何做SQL Server内部 - 要启动与SQL Server本身的启动。 (*)例如,我在SSMS活动监视器中看到正在运行的进程(任务状态:RUNNING,命令:SELECT),该进程通过SQL Server代理在tempdb数据库的上下文中不断执行T-SQL(根据Profiler)被禁用并且SQL Server未被加载,请参阅“Where are all those SQL Server sessions from?”中的“会话54的详细信息”。

我该怎样做定期回收存储过程的类似驻留进程(或者,更确切地说,由SQL Server启动服务或会话自动启动)?

相关问题:
Stored procedure executes slowly on first run

更新:
可能是我应该在2已付出这个问题,但我的主要的好奇心是如何有定期/循环活动与SQL Server代理被禁用?
上面提到的RUNNING SELECT会话(*)怎么样?

UPDATE2:
我经常观察到相当大的延迟在执行查询其不仅可以通过必要解释读取数据的海量数据量非常小的存储过程。

我们可以考虑这个 - 对微不足道的小数据的相当大的延迟 - 作为这个问题的背景吗?

+0

与缓存执行计划不同的是,它将数据缓存在内存中,提供最大的性能提升(因此理想的世界=拥有内存中的所有数据),因为这可以防止磁盘被击中 – AdaTheDev 2010-10-26 11:29:41

+1

@ vgv8:你为什么要这么做? – 2010-10-26 11:29:47

+0

另外请注意,有时你可能想要重新编译一个sproc,而不是使用缓存中的计划 – AdaTheDev 2010-10-26 11:33:09

回答

0

只需从脚本执行它。你可以在任何sql server重新启动后执行此操作。如果他们经常使用,那么在这之后应该不是什么大问题。

+2

不能保证它保持在缓存中,除非它连续击中并超过其他活动 – 2010-10-26 11:29:18