2010-03-01 22 views
0

我有一個存儲過程,在幾周後開始運行非常緩慢。它在幾秒鐘內開始執行,最終需要幾分鐘才能執行。sql server 2005 - 先前快速執行存儲過程,緩慢運行,直到丟失並重新創建

我們發現,刪除並重新創建過程會導致它在幾秒鐘內再次執行。

該過程本身包含一些內部連接和一對左外部連接 - 但沒有什麼不同尋常的。

爲什麼它應該如此顯着地放緩,我們應該怎麼做才能防止這個問題發生呢?

非常感謝。

+2

聽起來參數嗅探:http://elegantcode.com/2009/06/24/repost-watch-out-for-sql-server-parameter-sniffing/ – 2010-03-01 05:12:45

回答

1

SQL Server有一些叫'參數嗅探'的東西。基本上,您第一次在創建的基礎上將您執行計劃運行到您傳遞給SP的值上。用相同的值再次運行它 - 速度很快,如果這些值對於最初生成的執行計劃「不好」,它可能會變得非常慢,以不同的值運行。

爲避免參數嗅探,可以在存儲過程中爲每個參數聲明一個局部變量,並將參數分配給局部變量。然後在存儲過程代碼中只使用變量而不使用參數。這種執行計劃將不會基於您在第一次運行時使用的值。

如果你的谷歌'sql參數嗅探',你也可以找到很多關於這個主題的好文章。

0

這聽起來像執行計劃失控。您不必刪除並重新創建它。你應該可以調用sp_recompile並在下次執行時重新編譯它。當它這樣做時,它會建立一個新的執行計劃。我要檢查的另一件事是,各種表上的統計數據保持最新,並且在調用sp_recompile之前是最新的。

0

除了迄今爲止提供的答案,您的執行計劃將依賴於數據庫中的統計數據。如果這些不是最新的,那麼執行計劃不可能是最佳的。您可以使用UDPATE的統計數據:

EXEC sp_updatestats 
相關問題