2014-03-13 91 views
1

我們使用實體框架來查詢SQL服務器數據庫。 LINQ表達式是IQueryable。該查詢大約需要10秒鐘才能執行。如果這是在一個存儲過程中,我會玩弄查詢以提高效率。然而,如果我使用IQueryable,實體框架本身是否決定如何構建一個有效的查詢,還是必須使用linq表達式並通過試驗和錯誤來提高性能?實體框架性能調優

+0

這將是最好的包括實際的查詢,這樣的抽象問題通常不會幫助未來的讀者。 –

回答

0

做實體框架本身就如何建立一個高效的查詢

EF總會自動確定如何構建查詢,和SQL -server也自動地優化查詢決定。

我必須玩弄LINQ表達式,並通過試驗和錯誤來提高性能嗎?

你可以嘗試與查詢,但發揮一般微小的變化不會影響性能(在表達式中的順序計算)

您可以隨時使用SQL Profiler觀看EF做什麼,看看如何高效查詢是。如果需要很長時間,則可以重新運行SSMS中的查詢並打開Include Actual Execution Plan並確定查詢速度慢。

0

如果您使用EF 6,則可以非常輕鬆地啓用日誌記錄。然後,您可以檢查每個呼叫正在做什麼。我會從那裏開始。 MSDN EF6 Logging

你能夠分享更多關於你的查詢和結果大小嗎?

+0

我已經能夠在SQL分析器中看到查詢。我想問的是,有沒有一種方法可以調整linq表達以獲得最佳性能。 – developer747

+0

@ developer747,有時您可以將複雜查詢拆分爲較小的查詢,這可以改變總體執行時間。但是您需要分享查詢以便更好地幫助您。 – Romias

0

作爲數據庫開發人員比C#開發人員,多與接觸非常有限的實體框架的細節,我可以說:

我的理解是,實體框架決定如何建立一個查詢,可能沒有太多的能力瞭解效率。有可能是一些事情你可以在你的Linq查詢或Lambda表達式中做得更好或更差,但大多數情況下你可能無法真正調整查詢。這是使用ORM的一個主要缺點,至少從數據庫管理員的角度來看,他們在深夜服務器爬行停止時無法執行任何操作來修復查詢,而且它不像您總是可以添加索引;-)。

我也可以說你在Entity Framework中有選項可以爲每個DML操作指定一個存儲過程,這樣如果你真的需要用這個特定的查詢來做更好的事情,那麼就創建一個存儲過程這一操作並將EF對象指向SELECT,但允許EF爲INSERT/UPDATE DELETE構建查詢。

這有幫助嗎?