我有一個需要一分鐘才能運行的存儲過程。如果我使用存儲過程中的代碼並直接運行該代碼,則需要大約20秒。我想不出任何會導致這種情況的事情......爲什麼調用存儲過程比在存儲過程中運行代碼慢?
如果我看一下執行計劃,它們是不同的,但在查詢本身獲取執行計劃會增加與存儲過程調用相當的時間。
我試圖與該查詢創建一個新的存儲過程,但它只是作爲一個老慢...
我有一個需要一分鐘才能運行的存儲過程。如果我使用存儲過程中的代碼並直接運行該代碼,則需要大約20秒。我想不出任何會導致這種情況的事情......爲什麼調用存儲過程比在存儲過程中運行代碼慢?
如果我看一下執行計劃,它們是不同的,但在查詢本身獲取執行計劃會增加與存儲過程調用相當的時間。
我試圖與該查詢創建一個新的存儲過程,但它只是作爲一個老慢...
我完全從格蘭特Fritchey偷這一點,但至少我給他適當的信貸:
參數嗅探通常是這樣的原因。當您將查詢作爲查詢運行時,所有參數都是本地的,因此SQL Server可以查看它們,嗅探它們,並根據這些值確定執行計劃。只要將參數放入存儲過程中,SQL Server就會正確地在參數中假定一個未知值,並創建一個不同的執行計劃。在大多數情況下,這很有效。在某些情況下,它不會。
有什麼我可以做的嗎 – CodeRedick 2010-12-02 21:21:57
是否有可能因爲存儲過程創建數據已經改變/增加了不少?回想一下,存儲過程的一點是緩存執行計劃,以便下一次運行不必這樣做。如果數據隨時間劇烈變化,則可能無法正常運行。
要強制SQL來建立一個新的執行計劃的存儲過程,並瞭解更多去here
我試圖創建一個新的存儲過程來測試,並沒有區別。新的sproc與舊的sproc一樣慢...... :( – CodeRedick 2010-12-02 21:13:15
聽起來像是你有「包括實際的執行計劃」橫空當您運行存儲過程上。如果是這樣,請關閉該選項來嘗試。
不,我只有在我實際上試圖看看執行計劃的時候纔有這種想法 – CodeRedick 2010-12-02 21:12:43
發佈代碼。沒有我們所能做的就是猜測。 – GilaMonster 2010-12-06 01:18:15