2012-06-21 64 views
0

我發現了一個有趣的問題,即存儲過程在Entity Framework中執行得非常緩慢。我已經解決了這個問題,但是我想聽聽有沒有人能告訴我爲什麼解決方案能夠工作。由於日期參數,實體框架中存儲過程緩慢

問題

我具有接收類型DATETIME@date參數存儲過程GetLoginCount。當我直接在數據庫上執行這個存儲過程時,它會在一秒鐘內執行。當通過我的應用程序通過實體框架執行時,大約需要45秒。

我已經嘗試在存儲過程中使用WITH RECOMPILE並清除服務器上的執行計劃,以確保它沒有緩存一些執行計劃沒有使用正確索引的緩慢版本。

後的實驗2天快速前進,我發現,如果我只是把我的存儲過程的開頭如下:DECLARE @date1 DATETIME = @date和使用@ DATE1相反,存儲過程執行在1秒內,也從實體框架。

爲什麼?

我已經解決了我的問題,這一切好的和罰款,但我需要知道爲什麼這個特定的解決方案工作。

+0

如果使用字面日期時間進行嘗試而不是使用變量或參數,您是否可以確認性能?如果這太慢了[很可能需要更新統計信息](http://sqlinthewild.co.za/index.php/2011/03/22/statistics-row-estimations-and-the-ascending-date-column/ ) –

+0

是的,如果我在我的存儲過程中使用@date代替日期而不是使用@date,它會很快執行。 –

+0

並且您正在測試的計劃清除後,您作爲參數傳遞相同的字面值?分配給變量並使用變量禁用參數嗅探。即SQL Server不再具有特定的日期,它可以在統計信息中查找以獲得選擇性估計值,並根據'未優化的未知值'猜測。 –

回答

0

馬丁·史密斯給了在註釋中正確的答案,但他並沒有把它作爲一個答案,我在這裏將它,這樣我就可以正確地標記爲回答了這個問題:

「分配到一個變量,使用可變禁用參數嗅探。即SQL Server不再有它可以查找在統計中得到選擇性估計的具體日期,只是猜測,每OPTIMIZE未知」

使用OPTIMIZE未知確解決了這個問題。