【问题标题】:Best way to update SQL Table with reference to a Datatable C#参考 Datatable C# 更新 SQL 表的最佳方法
【发布时间】:2013-06-07 07:04:15
【问题描述】:

我有一个包含 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)

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

【问题讨论】:

  • 我会在临时表中导入数据表,然后只在 SQL 中进行更新。我不知道你是否可以根据你的情况这样做。
  • 如果我使用临时表,并使用 In 语句会更快并减少锁吗?
  • 您可以将多线程位委托给 SQL,当然所有数据都在 SQL Server 的内存中,所以,是的,速度更快,而且没有死锁。

标签: c# .net sql sql-server


【解决方案1】:

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

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

【讨论】:

  • 如果结构不同,批量复制是否有效?,因为我无法访问源数据库的主表结构,因为数据属于另一家公司的应用程序,他们不愿意共享他们的结构。
  • bulkcopy 应该在中间表中完成(Ticket 表见第 2 项)
猜你喜欢
  • 2023-04-07
  • 2016-03-16
  • 2016-07-08
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多