EF效能優化

風靈使發表於2018-06-08

情況介紹

在專案中,我用EF儲存2W條資料時,花費竟然1小時20分鐘左右,然後我只能……

測試草圖

測試草圖,僅供借鑑看,下面我會詳細總結。
這裡寫圖片描述

優化方法總結

1.連線保持暢通

意思是不要在需要的時候連線了不需要的時候斷開,需要了又去連線(特殊情況除外),目的在於減少對資料庫的操作。

2.關閉EF的一些配置

EF使用時,會在Config中配置,對於使用CRUD功能,有一些是用不到的,可以關閉,關閉後的測試效果加快幾秒,略微提升。
這裡寫圖片描述

檢測對 POCO 實體的屬性和關係所做的更改。 請注意,某些型別的實體(如更改跟蹤代理和派生自 EntityObject 的實體)會自動報告更改,並且這些型別的實體通常不需要呼叫 DetectChanges。 另請注意,通常,DbContext 的許多方法及其相關類會自動呼叫 DetectChanges,這樣一來,便很少需要顯式呼叫此方法。 但通常出於效能原因,可能需要使用 Configuration 中的 AutoDetectChangesEnabled 標誌來關閉對 DetectChanges 的自動呼叫。

3.存入List

EF支援AddRange,如果需要存5條資料,將這5條資料放入list一次存入,要比一條一條的存大大的快。

4.查詢資料用Linq or Lamba

遇到這樣的情況,你需要從資料庫中取某一條特定的資料,然後處理這條資料後存入另一個表,用foreach是吧,太慢了,換成Linq,上面草圖中有個備註,再換成lamba試試。

5.資料放入記憶體

如果要從一個表中多次找資料來使用,那不如第一步先將這個表中所有資料或者需要的那部分特徵資料都先放入記憶體中,從記憶體中讀取的速度,大大的快於運算元據庫,而這目的,也就是減少運算元據庫的次數,耗效能。

6.使用BulkInsert

使用外掛Extended,使用其中的BulkSaveChanges代替EF原生態的SaveChanges來儲存資料,附截圖來引用一段話:

這裡寫圖片描述

然後我親測結果如圖:
這裡寫圖片描述

1000條資料,BulkSaveChanges花費1s,SaveChanges花費27s……

外掛名:
這裡寫圖片描述

對於該外掛的一些使用方法,我也附上網址:
http://bulk-operations.net

7.使用SQL語句

如果你對速度還不滿意,可以CRUD,直接使用SQL語句來操作。
可以參考:
http://www.cnblogs.com/LingzhiSun/archive/2011/04/15/EF_Trick2.html#2774378

8.多表只需存一張

遇到這樣的情況,P、T兩張表,關係是1—–(0,1)的關係,你可能會先存入P表的資料,然後foreach P表的資料,找到對應的給T表的導航屬性賦值,然後存入這條資料到T表,這個問題很嚴重也可笑,但是我身上缺犯了,只需要存 必須存導航資料(T表資料),有關聯的表資料自然存入了(P表)

結尾

上述我總結的方法中,沒有使用SQL語句,原先花費1小時20分鐘的事,現在花費70s,竟然真的做到了。

相關文章