【发布时间】:2014-04-10 13:16:35
【问题描述】:
我在表格中插入了一个新列 HashHash。然后我需要编写一个小函数,将HashHash 的值设置为Sha1(Row.Hash):
public static void UpdateAllHashHashes()
{
using (var db = new MainContext())
{
var q = db.v2Hashes;
foreach (var rec in q)
{
rec.HashHash = GetSha1(rec.Hash);
db.SubmitChanges();
}
}
}
该表有数千条记录。我第一次运行它时,花了好几分钟。它在接近尾声时抛出了一个错误,导致它无法完成并留下约 20 条记录未处理,这是我半预期的,所以我再次运行该函数以获取最后运行良好的记录。
- 第一次,大约需要 2 分钟
- 第二次大约需要 2 秒
第二次传递这么快的原因是因为db.SubmitChanges 实际上没有执行 SQL,因为值没有改变吗?我仍然希望它运行UPDATE SQL 查询。
或者,这是某处的数据库引擎优化吗?
【问题讨论】:
-
如果值没有改变,我强烈怀疑这就是第二次速度如此之快的原因。如果您尝试将记录设置为它已有的相同值,它不会被标记为脏,因此不会在您
SubmitChanges时更新。顺便说一句,您不能将SubmitChanges移到循环之外吗? -
@MattBurland 我不认为他可以,除非他将记录更改保存到某个位置并在那里运行提交更改。我认为在循环之外运行 submitchanges 只会查看 var 1 = db.v2hashes 并且什么都不做。
标签: c# sql-server performance linq