2009-12-04 136 views
2

我正在使用實體框架在我的SQL Server 2008數據庫上分層。 EF存在於我的Web服務中,Web服務由Silverlight客戶端調用。實體框架性能

根據查詢在EF中執行的持續時間,我發現一個嚴重的性能問題。這在連續的呼叫中不會發生。

有一點谷歌搜索顯示,它是由每個應用程序域導致構建數據庫對象的內存模型。我發現這個微軟link解釋了性能改進的前景觀。即使在實施這些步驟之後,性能實際上也會降低,而不是提高。我很好奇,如果有人已經成功地嘗試了這種方法,並且還有其他改進性能的途徑。

我正在使用.NET 3.5。

+0

你是否分析過並確定它是因爲實體框架還是由於查詢本身而變得緩慢? – 2009-12-04 05:15:00

+0

@克里斯:不,我沒有。你能拋出一些指針嗎? – pencilslate 2009-12-04 05:28:27

回答

2

幾個方面來看看EF的性能

  1. 打電話之類的東西tolist之前做盡可能多的處理()。 ToList將把集合中的所有內容放入內存中。默認情況下,EF將繼續構建表達式樹,並只在需要內存中的數據時才實際處理它。第一個查詢將針對數據庫,但之後的處理將在內存中。處理大量數據時,您絕對需要儘可能多地完成數據庫的繁重工作。
  2. EF 1只能將整行拖回。因此,如果你有一個字符串是一個大的字符串或二進制blob,它將被拉下來,無論你是否需要它。您可以創建一個不包含此列的投影,但是您沒有獲得將它作爲實體的好處。
  3. 你可以看一下使用建議在這個崗位 How do I view the SQL generated by the Entity Framework?
2

相同的物理定律適用於EF查詢和普通SQL。檢查你的數據庫表,並確保你有主鍵和外鍵的索引,你的數據庫已經正確的標準化,等等。如果微軟的建議後性能下降,那麼這是我對問題領域的猜測。

0

使用SQL事件探查器檢查執行多少個查詢來檢索您的數據。如果數量很大,則使用Include()方法ObjectQuery在一個查詢中檢索具有父級的子對象。

1

你託管在IIS web服務由EF生成的SQL?它是否與Silverlight應用程序在同一個網站上運行?數據庫本身呢?它是否在專用機器上運行?有其他應用程序擊中它嗎?第一次打電話到休眠數據庫是痛苦的(我曾經有過在我的環境中實際超時的情況。)

這裏有很多因素需要考慮。但它不僅僅是EF的開銷。

編輯我沒有完全符合條件,但無論您的數據訪問解決方案如何,打開與SQL Server的第一個連接的過程都很慢。

+0

@Mike:我目前正在同一臺機器上運行SQL Server的測試平臺IIS環境。大約需要2分鐘才能完成EF中執行的ToList方法。你會建議我看看還有哪些其他的指針? – pencilslate 2009-12-04 06:10:22

+0

我會說這是一個非問題。然而,一條路線是使用自託管的WCF服務,並在啓動過程中將該服務調用爲一個簡單例程,以便在進行客戶端調用之前,它已與SQL Server建立通信。 這裏主要的問題是你在同一臺機器上測試。如果您在生產機器上發現問題,那麼可能值得解決。但有辦法緩解它。 – 2009-12-04 14:08:49