實體框架如何適用於大量記錄?

c# database-design entity-framework entity-framework-6

在這裡看到一個未回答的問題。

我的問題是 -

EF真的可以為大型應用做好準備嗎?

問題源於這些基本問題 -

  1. EF將所有記錄拉入內存,然後執行查詢操作。當表有大約1000條記錄時,EF的表現如何?
  2. 對於簡單的編輯,我必須拉動記錄編輯它然後使用SaveChanges()推送到數據庫

一般承認的答案

我遇到了類似的情況,我們有一個大型數據庫,每個表有700萬到1000萬個記錄。我們使用Entity框架來顯示數據。為了獲得良好的表現,這是我所學到的; 我對實體框架的10條黃金規則

  1. 了解僅在需要實際記錄時才對數據庫進行調用。所有操作都只是用於進行查詢(SQL),因此嘗試僅獲取一段數據而不是請求大量記錄。盡可能修剪提取大小

  2. 是的,(在某些情況下,存儲過程是一個更好的選擇,它們並不像有些人所說的那樣邪惡),你應該在必要時使用存儲過程。將它們導入模型並為其進行函數導入。您也可以直接調用它們ExecuteStoreCommand(),ExecuteStoreQuery <>()。對於函數和視圖也是如此,但EF有一種非常奇怪的方式來調用函數“SELECT dbo.blah(@id)”。

  3. 當必須使用深層次結構填充實體時,EF執行速度較慢。對具有深層次結構的實體要非常小心

  4. 有時,當您請求記錄而您不需要修改它們時,您應該告訴EF不要觀察屬性更改(AutoDetectChanges)。這樣記錄檢索要快得多

  5. 數據庫的索引是好的,但在EF的情況下它變得非常重要。用於檢索和排序的列應正確編制索引。

  6. 當你的模型很大時,VS2010 / VS2012模型設計師會變得非常瘋狂。所以將您的模型分解為中型模型。存在一個限制,即不能共享來自不同模型的實體,即使它們可能指向數據庫中的同一個表。

  7. 當您必須在不同位置對同一實體進行更改時,請使用同一實體,進行更改並僅保存一次。重點是AVOID檢索相同的記錄,進行更改並多次保存。 (實際性能增益提示)。

  8. 當您只需要一列或兩列中的信息時,請嘗試不要獲取完整實體。你可以直接執行你的sql或者有一個迷你實體。您可能還需要在應用程序中緩存一些常用數據。

  9. 交易很慢。小心他們。

  10. SQL事件探查器或任何查詢分析器是您的朋友。在開發應用程序時運行它以查看EF發送到數據庫的內容。在您的應用程序中使用LINQ或Lambda表達式執行連接時,EF通常會生成一個Select-Where-In-Select樣式查詢,該查詢可能並不總是很好。如果你發現任何這種情況,請捲起你的袖子,在數據庫上執行連接並獲得EF檢索結果。 (我忘記了這一個,最重要的一個!)

如果你記住這些事情,EF應該提供與普通ADO.NET幾乎相似的性能,如果不相同的話。


熱門答案

1. EF將所有記錄拉入內存,然後執行查詢操作。當表有大約1000條記錄時,EF的表現如何?

這不是真的! EF僅提取必要的記錄,並將查詢轉換為適當的SQL語句。 EF可以在DataContext本地緩存對象(並跟踪對實體所做的所有更改),但只要您遵循規則以僅在需要時保持上下文打開,它就不會成為問題。

2.對於簡單的編輯,我必須拉動記錄編輯它然後使用SaveChanges()推送到數據庫

這是真的,但除非你真的看到性能問題,否則我不會費心去做。因為1.不是真的,所以在保存之前,只能從DB中獲取一條記錄。您可以通過將SQL查詢創建為字符串並將其作為純字符串發送來繞過它。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因