Dot-Net

實體框架中的儲存過程很慢

  • March 20, 2013

我正在使用以下查詢從實體框架呼叫儲存過程(返回數據)

from sp in db.GetSale(bID, SID,m,y).Where(x => x.isActive == true)
select sp

如果我直接執行這個過程,只需要2秒,但是當我通過EF呼叫這個儲存過程時,需要10到15秒。

有什麼改善這種情況的指導嗎?我在 SO 上看到過其他文章,但沒有成功

編輯

這是我的程序的 sqlplan https://skydrive.live.com/redir?resid=87DCBD5D3E9AAA57!374

我懷疑參數嗅探。

嘗試在您的過程中應用反參數嗅探程式碼。(在使用它們之前將參數分配給局部變數)。

http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx

請記住,您的.Where(x => x.isActive == true)過濾器不會應用於程序本身。當您處理表時,過濾器被傳遞給 where 子句並在數據庫上執行。在您的情況下,將執行 proc(不帶活動子句),完整的結果集將返回給應用程序,然後where將被應用。

我知道你說 proc 更快,但你確定你沒有以某種方式將 isActive=true 作為參數傳遞給它嗎?

我看到你已經在這個 proc 上有了參數,所以如果你將狀態添加為另一個參數並在查詢級別應用它,它會提高你的性能。

引用自:https://stackoverflow.com/questions/12707375