2016-02-12 65 views
0

不會影響我試圖插入10000行用的EntityFramework 6.爲了加快這一進程,我是禁用AutoDetectChanges塞汀AutoDetectChangesEnabled爲false,插入速度

using (var db = new TestDbContext()) 
     { 
      try 
      { 
       db.Configuration.AutoDetectChangesEnabled = true; 
       db.Adresses.AddRange(adresesModel); 
       db.SaveChanges(); 
      } 
      finally 
      { 
       db.Configuration.AutoDetectChangesEnabled = true; 
      } 
     } 

幾天前,這個過程花了〜 100毫秒,但現在我禁用AutoDetectChanges花了〜70000毫秒 啓用AutoDetectChanges它也需要〜70000毫秒

我找不到爲什麼禁用AutoDetectChanges不要插入速度影響的原因!

+0

也許它並不試圖在一系列檢測更改,或者這個過程花費的時間可以忽略不計。爲什麼要保存到數據庫需要更長的時間還有很多其他原因。 – krillgar

+0

其中一個原因可能是你有很多索引在你的桌子上(或者可能最近你在桌子上添加了很多索引)....所以索引重建可能加起來這次 – Viru

+0

我的數據庫是DropCreateAlways和幾天前......就像我之前說的那樣......過程花費了大約100毫秒。我沒有更改代碼或MSSQL設置,現在花費了大約70000毫秒 – Timbioz

回答

1

我無法解釋爲什麼它前幾天需要100毫秒,我相信你沒有增加相同數量的實體。

AutoDetectChangesEnabled不像您想象的那樣工作。

AutoDetectChangesEnabled =真

  • 地址:嘗試每一條記錄(非常差)
  • 的AddRange之後檢測變化:儘量一次檢測更改每一條記錄被添加(1次)
  • 的SaveChanges :嘗試檢測更改(1次)

AutoDetectChangesEnabled = false

  • Add,AddRange & SaveChanges:未檢測到更改。

所以AutoDetectChanges與AddRange一起使用幾乎沒有區別。人們習慣於相信插入在禁用時會更快,但只有在與「添加」一起使用時纔會這樣。

有什麼不同之處在於你插入了10000個實體,所以你實際上在做10,000個數據庫往返這對性能來說真的很糟糕,這就是爲什麼它需要70000ms才能保存。

只有BulkInsert庫解決這類問題:

免責聲明:我是這個項目的所有者Entity Framework Extensions

+0

仍然沒有找到爲什麼AutoDetectChanges對我來說,但efbulkinsert.codeplex.com幫助...〜150毫秒10000行。謝謝 – Timbioz