存储过程在首次使用时编译。
有清除缓存的选项:
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
--To Verify whether the cache is emptied
--DBCC PROCCACHE
或重新编译或减少重新编译。
但是,是否可以强制将经常使用的存储过程的执行计划预先缓存并保留在内存中?
我知道如何在ADO.NET中实现它,即从SQL Server外部,但这个问题是如何在SQL Server内部执行 - 随着SQL Server本身的启动而启动。
(*)例如,我在SSMS活动监视器中看到一个正在运行的进程(任务状态:RUNNING,Command:SELECT),它在tempdb数据库的上下文中不断执行T-SQL(根据Profiler),尽管SQL Server代理是禁用和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 :(得分:0)
只需从脚本执行即可。你可以在任何sql server重启后执行此操作。如果经常使用它们,那么它应该不会有太大的问题。
答案 1 :(得分:0)