【问题标题】:Update records in a loop performance in c# and sql在c#和sql中循环性能更新记录
【发布时间】:2013-02-14 14:27:13
【问题描述】:

我需要从我的 C# 应用程序更新数据库中的 100 条记录。

我使用了一个 foreach 语句并调用了一个存储过程来更新每个记录,如下所示:

foreach (var record in recordList)
{  
    dbWatch.Start();
    DbService.UpdateRecord(Id, ProcessDate, MessageID, task.Result.Email.TryTimes);
    dbWatch.Stop();
    LogMessage(string.Format("Single database row update toke:{0}",dbWatch.Elapsed));
}

一切正常,除了开始时,更新每条记录大约需要 00:00:00.00123343,但随着更新越来越多,它需要的时间越来越长。在将近 1000 条记录之后,更新每条记录大约需要 00:00:04 秒。

我想知道为什么会这样?

【问题讨论】:

  • 什么是 dbWatch?在调用 .Start() 之前是否必须重置它?
  • 鉴于您的 recordList 可能来自另一个查询,如果可能,请寻找进行更新的方法,而不是将数据带回您的应用程序并循环访问它。
  • 顺便说一句,您是否希望从不使用循环变量record 来更新数据库?

标签: c# sql performance foreach


【解决方案1】:

我认为这只是一个不正确的测量。您的循环不会重新启动StopWatch,它只是连续启动和停止它。所以Elapsed会一直增加。

如果你想测量整个时间:

dbWatch.Start();
foreach (var record in recordList)
{  
    DbService.UpdateRecord(Id, ProcessDate, MessageID, task.Result.Email.TryTimes);
}
dbWatch.Stop();
LogMessage(string.Format("All updates took:{0}",dbWatch.Elapsed));

如果您想测量每次迭代的时间,请使用StopWatch.Restart

foreach (var record in recordList)
{  
    dbWatch.Restart();
    DbService.UpdateRecord(Id, ProcessDate, MessageID, task.Result.Email.TryTimes);
    dbWatch.Stop();
    LogMessage(string.Format("Single database row update took:{0}",dbWatch.Elapsed));
}

【讨论】:

    【解决方案2】:

    如果您想测量每次更新的时间,您必须在循环结束时调用 dbWatch.Reset() 或在开始时调用 Restart()。我假设它是System.Diagnostics.Stopwatch。 见MSDN - Stopwatch

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-01
      • 2023-03-27
      • 1970-01-01
      • 2012-12-30
      • 2021-08-19
      • 1970-01-01
      • 2010-10-08
      • 2014-01-09
      相关资源
      最近更新 更多