2011-08-08 63 views
2

我有通過SSMS阿5秒SP擊中30秒的超時通過LINQ到SQL

當該相同SP通過執行在5秒內,其執行SP一個LINQ到SQL Excel加載它倍(對同一個SP的簡單查詢需要很長時間但返回結果)

然後我更改了SP,以便它將所有輸入參數重新分配給SP中的新本地參數。這使得SP在SSMS中運行了36秒(所以這就是爲什麼SSMS起步非常快的原因)

所以我猜測SQL服務器沒有使用參數嗅探來檢測我的LINQ- SQL查詢?

所以,我的問題是,有什麼辦法,使SP的速度在LINQ到SQL,因爲它是在SSMS(與它的參數嗅探)

+1

我想你已經看了很明顯的東西像確保您的LINQ到SQL是指向正確的服務器,並且您正在SSMS和LINQ中測試相同的參數......當您的proc運行時,當您運行sp_who2時,您對spid有什麼看法?它被阻止了嗎? –

+0

我會使用分析器並檢查兩種情況下的執行計劃(SSMS和Linq2SQL),也許你能夠找到差異。如果在兩種情況下參數都是相同的,則不應該有差別。如果參數不同,SQLServer可能會有一個錯誤的執行計劃。但沒有進一步的細節,很難說。 –

回答

5

的SQL Server優化存儲過程相同無論你是從SSMS還是從LINQ調用它們。但它確實使用計劃緩存。一個計劃被存儲,以便以後使用相同的登錄+ ansi設置重複使用。傳入的第一個值可以確定計劃的外觀。如果不同的登錄/設置以不同的值開始,那可能導致不同的緩存計劃。這是LINQ和SSMS之間性能差異的一個解釋。

要重置所有緩存計劃,請使用:

DBCC FREEPROCCACHE 

爲了有SP的正是你與調用值優化,可以使用with recompile

create procedure dbo.MySP with recompile as ... 

這個原因爲每個調用編譯的過程。這會否定參數化。

(你的情況是相當不尋常的。SQL Server有一個選項,以force parameterization,但沒有選擇,以防止它。)