Asp.net
從 Web 呼叫儲存過程時速度慢,從 Management Studio 呼叫時速度快
我的儲存過程每次從 Web 應用程序呼叫時都會瘋狂超時。
我啟動了 Sql Profiler 並跟踪了超時的呼叫,最後發現了這些事情:
- 當從 MS SQL Management Studio 中執行語句時,使用相同的參數(實際上,我從 sql 配置文件跟踪複製了過程呼叫並執行它):平均在 5~6 秒內完成。
- 但是當從 Web 應用程序呼叫時,它需要超過 30 秒(跟踪),所以我的網頁實際上超時了。
除了我的 Web 應用程序有自己的使用者這一事實之外,每件事都是相同的(相同的數據庫、連接、伺服器等)我還嘗試使用 Web 應用程序的使用者直接在工作室中執行查詢,並且不需要超過 6 個秒。
我如何知道發生了什麼?
我假設這與我們使用 BLL > DAL 層或表適配器這一事實無關,因為跟踪清楚地表明延遲存在於實際過程中。這就是我能想到的。
編輯我在此連結中發現 ADO.NET 設置
ARITHABORT為 true - 這在大多數情況下都很好,但有時會發生這種情況,建議的解決方法是向with recompile儲存的 proc 添加選項。就我而言,它不起作用,但我懷疑它與此非常相似。任何人都知道 ADO.NET 還能做什麼或我在哪裡可以找到規範?
過去我也遇到過類似的問題,所以我很想看到這個問題的解決方案。Aaron Bertrand 對 OP 的評論導致Query 在從 web 執行時超時,但從 SSMS 執行時超快,雖然問題不是重複的,但答案很可能適用於您的情況。
從本質上講,SQL Server 可能有一個損壞的記憶體執行計劃。您的 Web 伺服器遇到了錯誤的計劃,但 SSMS 採用了不同的計劃,因為 ARITHABORT 標誌上有不同的設置(否則對您的特定查詢/儲存過程沒有影響)。
另一個例子見ADO.NET呼叫T-SQL儲存過程導致SqlTimeoutException,有更完整的解釋和解決方法。