4

我想知道你們是否可以幫我弄到我最近在SQL Server上出現的一個奇怪問題的底部。SQL Server程序執行計劃的奇怪問題

我有一個存儲過程(讓我們打電話SPold),這是一個相當大的計算量很大(不可能在應用程序中做到這一點,因爲大約6000用戶需要返回一個呃這到基於Surname的1000))。存儲過程通常在幾秒鐘內執行,並且每隔幾分鐘調用一次。

現在今天早上,存儲過程突然執行4-10倍,導致一些超時。我發現通過使用新名稱(SPnew)製作一個過程副本並執行,我會再次獲得快速執行時間。這表明執行計劃與原始版本SPold有關,因此我決定使用重新編譯來執行它。這樣可以更快地返回結果(雖然速度不及SPnew),但用戶後續撥打SPold的速度再次緩慢。這就像新計劃沒有被保留。

我所做的就是修復這個問題,把Exec SPnew改成SPold,現在撥打SPold又回來了。

有沒有人知道這裏發生了什麼?一夜之間更新的唯一數據是統計數據,但我認爲這應該會影響SPoldSPnew

回答

4

我也遇到了Sql Server 2005中的兩個「奇怪」情況,這可能與您的問題有關。

在第一種情況下,我的過程在作爲dbo運行時以高速運行,並且在應用程序中運行時速度很慢,在不同的用戶帳戶下。

在第二種情況下,程序的查詢計劃針對第一次調用該過程的參數值進行了優化,然後稍後將該計劃重用於其他參數值,從而導致執行速度緩慢。

對於第二種情況,解決方案是將參數值複製到過程中的局部變量中,然後在查詢中使用變量而不是參數。

+1

這可能有助於[緩慢的應用程序,快速SSMS? 瞭解性能之謎](http://www.sommarskog.se/query-plan-mysteries.html) – Kashif

+0

好的 - 我將其標記爲完整,儘管Mitch也是正確的,因爲它是參數嗅探。 Treaschf給了我一個解決方案,雖然...我也閱讀上面的鏈接,這是最豐富的。 – Milambardo

5

由於參數嗅探,聽起來像您正在經歷緩存不正確的查詢計劃。

你可以發佈存儲過程嗎?

在SQL Server 2005中,您可以使用參數的最佳值OPTIMIZE FOR查詢提示彌補一些與參數嗅探相關的問題:

OP TIMILDE for指示查詢優化器在編譯和優化查詢時爲本地 變量使用特定值。該值僅在查詢優化期間使用 ,而不是在查詢執行期間使用。 OPTIMIZE FOR可以抵消優化器的參數檢測行爲,或者可以在創建計劃指南時使用。有關更多 的信息,請參閱Recompiling Stored ProceduresOptimizing Queries in Deployed Applications by Using Plan Guides

OPTION (OPTIMIZE FOR (@myParam UNKNOWN)) 

可以實現在SQL Server同樣的效果:

儘管SQL Server 2005不支持OPTIMIZE未知其 將消除參數嗅探給定參數(在SQL Server 2008中引入)將參數複製到本地變量中,然後在查詢中使用本地變量。

+1

不幸的是,政策爲我發佈實際查詢。我可以改變它,但它會需要一段時間! 當然,索引和統計數據會影響兩個SP(舊的和新的),因爲它們駐留在相同的數據庫中? 我會研究參數嗅探,雖然... – Milambardo

+0

請downvoter請留下評論。謝謝。 –