2016-08-01 147 views
1

我在SQL Server中創建了一個存儲過程,它在一秒內返回數據。這個存儲過程可以在幾天內正常工作,並在稍後變得緩慢。但是,如果我不進行更改而重新執行它,則會變得很快。SQL Server存儲過程在一段時間後變得很慢

我才知道Recompile可能會解決這個問題。對此有何建議?

此外,由於此查詢幾乎每秒都會被觸發,因此ReCompile也會導致任何性能問題?

+0

你試過更新統計嗎? – bmsqldev

+0

您的問題缺少許多可以啓用一些初始分析的細節。例如:返回的數據來自哪裏? (假設它是從表中提取出來的,但是它們是如何組織的,這似乎是安全的);除了選擇外,SP在做什麼?返回的數據有多大? ..... – FDavidov

+0

也需要快速和慢時間的實際執行計劃。 – Lavel

回答

1

也會重新編譯導致任何性能問題,因爲這個查詢幾乎每一秒都被擊中?

是重新編譯發生在CPU resources.Even收費雖然編譯查詢計劃在幾毫秒內完成,這將因爲查詢wont't利用現有的查詢計劃

我增加額外的CPU的負擔知道重新編譯可能會解決這個問題?

SQL服務器將存儲與傳遞的參數的查詢計劃和優化計劃,該輸入..

假設你有一個表具有大致相等的訂單每一位客戶,然後重新編譯每次不會幫助你

另一方面,如果你的客戶的訂單分佈不均勻,在1-10000的範圍內。在這種情況下,如果SP是使用有一個訂單的客戶輸入編譯的,那麼當10000個訂單客戶通過SQL時低估內存並可能泄漏到tempdb ..

有很多方法可以讓你克服parameter sniffing,嘗試閱讀我提到的鏈接,看看哪個選項適合你