4

我有一个包含 Id 列的数据表。Id 列与我的表 ID 列匹配。我需要使用这个 id 为我的 sql 表设置一个值。但是数据表结构和我的表结构不一样,即

  Data Table                        Sql Table
____________      _______________________________________________
ID                ID    | col 1 | col2 | col3 | col4 |final value
1                 1     | a     | b    |c     |d     |N
2                 2     | x     | y    |z     |a     |N

任何给定时间的数据表都将有超过500,000个条目。

我的问题是:

1)在一个事务中构建更新语句并在并行循环中执行它们会更快,如下所示:

Sqltrn = Sqlconn.BeginTransaction();
Parallel.For (0; Datatable.Rows.Count; i =>
    {
       SqlCmd.CommandText = BuildStatemet;
       SqlCmd.ExecuteNonQuery();
    });
SqlTrn.Commit();

上面的方法会导致我的桌子死锁吗?

或者

2) 通过从 dt 表中构建联系字符串来执行单个语句,如下所示:

Update MyTable set  FinalValue = 'Y' WHERE ID in (CreateConcactedStringHere)

哪种方法更快更安全,因为我需要在尽可能短的时间内完成更新,并且还要避免表锁定,因为它是我数据库中的主要事务表。或者还有其他方法可以实现吗?

4

1 回答 1

0

单独的行更新将比从选择中进行的单个更新更慢。为此,我建议

  1. 在您的数据库中创建一个如下表 TicketTable { TicketID, TargetID, SomePrecalculatedRes1, ..., SomePrecalculatedResN}
  2. 在 C# 中创建一个与上面的表具有相同结构的 DataTable 对象
  3. 按您将用于更新的数据填充表格内容。DataTable 的每一行都具有相同的ticketId。(并行处理可能会给您带来一些好处)
  4. 将 DataTable 内容批量插入 db.TicketTable(请参阅 参考资料SqlBulkCopy
  5. 创建一个更新命令,考虑您的 ticketId 并从您的票证表中选择更新您的目标表
于 2013-06-11T12:35:33.303 回答