我已经让我的模型根据以字典形式出现的一些信息更新数据库。我目前的做法如下:
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();
编辑:假设更新次数通常约为数据库总数的 5-20%
最佳答案
让我们看看:
方法一:
- 您将遍历数据库中的所有 1000 个项目
- 您仍然会访问字典中的每个项目并且有 950 次与字典不符
- 您仍然需要对数据库进行 50 次更新调用。
方法二:
- 您将遍历字典中的每个项目而不会遗漏字典中的内容
- 您将对数据库进行 50 次单独的查找调用。
- 您将对数据库进行 50 次更新调用。
这实际上取决于数据集的大小以及平均修改的百分比。
你也可以这样做:
方法三:
- 构建字典中所有键的集合
- 查询数据库一次,查找与这些键匹配的所有项目
- 遍历结果并更新每一项
就我个人而言,我会尝试确定您的典型案例场景并分析每个解决方案以查看最佳方案。不过,我真的认为第二个解决方案会导致大量的数据库和网络命中,如果你有一个大集合和大量更新,因为对于每个更新,它必须访问数据库两次(一次获取项目,一次更新项目)。
所以,是的,这是一种非常冗长的说法,“这取决于……”
如有疑问,我会根据生产场景的再现对它们进行编码和计时。
关于c# - 数据库更新的词典/列表速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7123935/