【问题标题】:Why does this function run orders of magnitude faster the second time round?为什么这个函数第二次运行的速度要快几个数量级?
【发布时间】: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


【解决方案1】:

提交更改仅适用于实际更改。将 12 的值更新为 12 的新值并没有改变。

http://msdn.microsoft.com/en-us/library/bb292162(v=vs.110).aspx

所以是的,你的怀疑是对的。

【讨论】:

    猜你喜欢
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 2021-10-21
    相关资源
    最近更新 更多