【发布时间】:2021-06-17 22:16:23
【问题描述】:
我有一段 C# 代码,它更新了本地主机数据库中 ~1000x20 记录的两个特定列。据我所知(虽然我离成为数据库专家还差得很远),应该不会花很长时间,但需要超过 5 分钟。
我尝试了 SQL 事务,但没有成功。 SqlBulkCopy 似乎有点矫枉过正,因为它是一个有几十列的大表,我只需要为一组记录更新 1/2 列,所以我想保持简单。有没有更好的方法来提高效率?
代码本身:
public static bool UpdatePlayers(List<Match> matches)
{
using (var connection = new SqlConnection(Database.myConnectionString))
{
connection.Open();
SqlCommand cmd = connection.CreateCommand();
foreach (Match m in matches)
{
cmd.CommandText = "";
foreach (Player p in m.Players)
{
// Some player specific calculation, which takes almost no time.
p.Morale = SomeSpecificCalculationWhichMilisecond();
p.Condition = SomeSpecificCalculationWhichMilisecond();
cmd.CommandText += "UPDATE [Players] SET [Morale] = @morale, [Condition] = @condition WHERE [ID] = @id;";
cmd.Parameters.AddWithValue("@morale", p.Morale);
cmd.Parameters.AddWithValue("@condition", p.Condition);
cmd.Parameters.AddWithValue("@id", p.ID);
}
cmd.ExecuteNonQuery();
}
}
return true;
}
【问题讨论】:
-
您使用的是哪个 dbms?
-
看起来您正在添加数千个参数并且没有清除该 CommandText,因为您一直在附加它。
-
您在循环中一次更新 n 行 1。如果性能是您的目标,您应该考虑以基于集合的方式进行一次更新,这在 20,000 行(不是记录)上可能需要几秒钟。
-
你永远不会清除参数集合,所以你一直在添加它。
-
您的代码在每次更新时都执行一次提交,这是 .NET SQL 库的默认事务处理,因此在每次 UPDATE 提交期间肯定会有延迟。我建议在事务中运行记录组,这样会更快。
标签: c# sql sql-server