2010-10-26 125 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