2014-08-31 87 views
0

我有一個存儲過程,它從5個表中獲取數據。表格在一小時內更新約1000條記錄和1000條更新。插入和更新後,存儲過程運行到超時。1000更新後索引健康和統計信息更新

當我重建存儲過程中引用的一個表的索引之一時,它再次開始正常工作..但它在每更新一次新的1000條記錄後再次分解。

我該怎麼辦?

回答

0

好的我認爲你說錯了,當你說重建索引正在解決問題。

我認爲這實際上是重建索引invalids緩存執行計劃和重建索引後的下一次執行將強制sql server重新編譯執行計劃。

通常,SQL Serve會爲存儲過程使用緩存的執行計劃,但即使存在緩存的執行計劃,也會導致sql server重新編譯存儲過程的執行計劃。重建或對存儲過程執行中使用的索引所做的任何更改都會導致重新編譯執行計劃。

由於您每小時插入1000行,並且您還希望保持統計信息的更新。我想說的是每晚做一份工作來更新統計數據。

但是對於您的存儲過程在您的過程定義中使用WITH RECOMPILE選項,或者在執行此存儲過程時使用此選項,我認爲它會解決問題。

在SP的定義添加此選項

ALTER PROCEDURE myProc 
WITH RECOMPILE 
AS....... 

還是要執行你的存儲過程,你可以做如下

EXECUTE myProc WITH RECOMPILE 

或者你也可以使用系統存儲過程時,添加此選項sp_recompile強制sql服務器編譯執行計劃,即使高速緩存中有一個計劃。

EXECUTE sp_recompile N'dbo.MyProc'; 
GO 

EXECUTE dbo.MyPrco; 
GO