2011-08-19 51 views
3

我有我的模型根據字典形式進來的一些信息更新數據庫。我現在做的方式是如下:數據庫更新字典/列表速度

SortedItems = db.SortedItems.ToList(); 
foreach (SortedItem si in SortedItems) 
{ 
    string key = si.PK1 + si.PK2 + si.PK3 + si.PK4; 
    if (updates.ContainsKey(key) && updatas[key] != si.SortRank) 
    { 
     si.SortRank = updates[key]; 
     db.SortedItems.ApplyCurrentValues(si); 
    } 
} 
db.SaveChanges(); 

難道是更快的通過字典迭代,併爲每個項目做一個數據庫查詢?字典只包含已更改的項目,並且可以是從2項目到整個集合的任何地方。我對替代方法的想法是:

foreach(KeyValuePair<string, int?> kvp in updates) 
{ 
    SortedItem si = db.SortedItems.Single(s => (s.PK1 + s.PK2 + s.PK3 + s.PK4).Equals(kvp.Key)); 
    si.SortRank = kvp.Value; 
    db.SortedItems.ApplyCurrentValues(si); 
} 
db.SaveChanges(); 

編輯:假設更新的數量通常是DB的約5-20%entires

+1

要記住的主要事情是,您的數據庫調用的可能性比字典查找要慢。因此,如果可能的話,您想盡量減少數據庫交互(作爲一般經驗)。 –

回答

4

讓我們來看看:

方法1 :

  • 你會從所有的1000個項目在數據庫中迭代
  • 您仍然可以訪問詞典中的每一項,並且有950次錯過字典
  • 您仍然有50次更新對數據庫的調用。

方法2:

  • 你會遍歷字典中的
  • 你必須50個人查找調用數據庫中沒有遺漏字典的每個項目。
  • 您將有50個更新對數據庫的調用。

這實際上取決於數據集有多大以及平均得到修改的百分比。

你也可以做這樣的事情:

方法3:

  • 建立一個集中的所有鍵從字典
  • 查詢數據庫一次匹配這些鍵的所有項目
  • 迭代結果並更新每個項目

就我個人而言,我會嘗試確定您的典型案例場景並分析每個解決方案以查看哪個最佳。不過,我認爲第二種解決方案,如果你有大量的更新和大量的更新,將會產生大量的數據庫和網絡點擊量,因爲對於每次更新,它都必須打兩次數據庫(一次獲得項目,一次更新該項目)。

所以,是的,這是一個很長篇大論說的方式「這取決於......」

如果有疑問,我會編寫既和他們基於的生產場景複製品時間。

0

要添加到@James'答案,您將使用存儲過程(或常規SQL命令)獲得最快的結果。

的問題LINQ到實體(和其他LINQ提供者,如果他們沒有最近更新的)是,他們不知道如何生產與where子句SQL更新:

update SortedItems set SortRank = @NewRank where PK1 = @PK1 and (etc.) 

一存儲過程會在服務器端執行此操作,而您只需要一個db調用。