2009-06-26 71 views
1

早上好!如何預編譯SQL Server中的存儲過程?

有什麼辦法可以預編譯SQL Server中的存儲過程嗎?我的要求是這樣的..我有一些存儲過程,需要更多的時間在編譯比執行。所以我想預編譯所有的存儲過程。當數據庫服務器啓動並運行時,預編譯它們會很好。

對此的任何想法都會非常有幫助!

謝謝& Regards, Pavan。

+1

你確定你並不是在這裏微調優化嗎?在真實世界中從來沒有見過像這樣的東西 – 2009-06-26 11:49:30

+0

我有一張包含數十萬條記錄的表。因此在其上啓用了索引視圖以更快地訪問數據。這是在該表上插入和更新的缺點。所以當我第一次執行時,負責插入的存儲過程需要很多時間。但稍後它會更快。我發現sp在編譯和準備執行計劃方面需要時間。一旦編譯完成,插入記錄就足夠快了。我可以通過預編譯來首次獲得這種快速性能嗎? – Pavan 2009-06-26 11:59:16

+1

你是否真的在一張桌子上有索引視圖?如果是,則在表格上創建索引,不要創建索引視圖。 – 2009-06-26 21:21:03

回答

2

可以強制重新編譯,但它不會發生運行它

EXEC SP_RECOMPILE YourProcedureName

more info here...

力它每次運行時重新編譯,直到下一次:
CREATE PROCEDURE YourProcedureNameWITH RECOMPILE .....

強制它重新編譯這次:
EXEC你用假數據

你爲什麼不手動運行它(應用程序之外)(沒那麼假的是:基於OP的評論WITH RECOMPILE

here is a good article on Optimizing SQL Server Stored Procedures to Avoid Recompiles

and another...

編輯 rProcedureName執行計劃不好,谷歌:SQL服務器參數欺騙和嗅探)第一次,這可以強制編譯,然後運行一些SQL來刪除插入的內容。當用戶第一次運行它時,它已經運行並被編譯。

+0

我試過使用sp_Recompile選項。但是當sp首次執行時,需要花費很多時間,並且稍後就足夠快了。我如何改進第一次使用? – Pavan 2009-06-26 12:04:23

1

如果您使用的是SQL Server 2008,那麼您可以使用計劃指南來強制重新使用現有的預編譯的執行計劃。

Understanding Plan Guides,更多詳情及然而,在特定的讀「OBJECT計劃指南」

我懷疑你的問題的根源是你的存儲過程中正在實施過程中的邏輯和建議這是你的第一個點審查性能調整。

+0

嗨,我正在使用Sql Server 2005,並在存儲過程中包含一個純插入語句。索引視圖存在於表上。所以準備執行計劃需要花費時間。任何想法我們如何能夠提前做好準備並保持執行狀態? – Pavan 2009-06-26 19:27:35

0

存儲過程只能在創建並首次執行時編譯(並且僅用於創建查詢計劃)。

如果你使用WITH RECOMPILE很多,你應該停下來。如果你這樣做是爲了強制重新計算查詢計劃,因爲不同的參數對不同的查詢計劃更有效地工作(如果這很重要,性能明智),那麼你需要考慮爲不同的查詢計劃創建不同的SP,可能使用「父母「SP來決定要撥打哪個電話。但這不是一個無痛苦的練習。

如果您的表格真的處於數百萬行的類別中,那麼我會仔細查看索引並保持統計數據是最新的,在安靜的時候定期重新編譯以保持查詢計劃的有效性。一旦進入數十萬或數億行,那麼可能會遇到重複的痛苦。

5

使用「SET FMTONLY ON」編寫執行每個存儲過程的腳本。

該過程將被編譯,但在執行過程中不會對數據庫進行永久更改。你不能在使用臨時表的過程中使用它(#table語法)。

這就是Microsoft在Visual Studio中如何確定存儲過程的輸出應該是什麼。

1

是否可以在不影響任何數據的情況下執行一次SP?如果是這樣,那麼你可能會找到一種方法來在服務器啓動時觸發此SP。

-1

這些天很少有編譯時間顯着。將此代碼插入到程序的頂部,並自己查看編譯所花費的時間。

SET STATISTICS TIME ON 
GO 

你會發現編譯時間在0ms通常給出,這意味着過小,無法打擾,而執行時間都在幾十,幾百,甚至上千毫秒。