gpt4 book ai didi

c# - 更新数千条记录的最有效方法是什么

转载 作者:太空狗 更新时间:2023-10-29 23:38:26 28 4
gpt4 key购买 nike

我们有一个 C# 应用程序,它从文本文件中解析数据。然后,我们必须根据文本文件中的信息更新 sql 数据库中的记录。将数据从应用程序传递到 SQL Server 的最有效方法是什么?

我们目前使用分隔字符串,然后在存储过程中循环遍历该字符串以更新记录。我也在使用 TVP(表值参数)进行测试。还有其他选择吗?

我们的文件包含数千条记录,我们想要一个花费最少时间的解决方案。

最佳答案

请不要使用 DataTable因为那只是在浪费 CPU 和内存而没有任何好处(除了可能熟悉之外)。我在回答以下问题时详细介绍了一种非常快速和灵活的方法,这与这个非常相似:

How can I insert 10 million records in the shortest time possible?

该答案中显示的示例仅适用于 INSERT,但可以轻松调整以包含 UPDATE。此外,它一次性上传 所有 行,但也可以很容易地调整为 X 条记录设置计数器并在传入许多记录后退出 IEnumerable 方法,并且一旦没有更多记录,然后关闭文件。这将需要将文件指针(即流)存储在静态变量中以继续传递给 IEnumerable 方法,以便它可以在下一次前进并在最近的位置拾取。我在以下答案中显示了此方法的一个工作示例,尽管它使用的是 SqlDataReader作为输入,但技术是相同的,只需很少的修改:

How to split one big table that has 100 million data to multiple tables?

从某些角度来看,50k 条记录甚至还算不上“庞大”。我一直在使用我在此处显示的方法在 400 万行文件上上传/合并/同步数据,并且命中了具有 1000 万(或更多)行的多个表。


不要做的事情:

  • 使用 DataTable : 正如我所说,如果您只是为了与 TVP 一起使用而填充它,那是在浪费 CPU、内存和时间。
  • 同时进行 1 次更新(如问题评论中所建议):这太疯狂了。关系数据库引擎经过大量调整,可以最有效地处理集合,而不是单例操作。 50k 插入不可能比 500 插入 100 行效率更高。单独执行它只会保证表上有更多争用,即使只是行锁(它是 100k 锁 + 解锁操作)。这可能比升级到表锁的单个 50k 行事务更快(如 Aaron 所述),但这就是为什么要分批进行,只要小并不意味着 1 行;)。
  • 任意设置批量大小。保持在 5000 行以下有助于减少锁升级的机会,但不要只选择 200 行。尝试多种批处理大小(100、200、500、700、1000)并尝试每一种大小几次。您将看到什么最适合您的系统。只需确保批量大小可通过 app.config 文件或其他方式(数据库中的表、注册表设置等)进行配置,以便无需重新部署代码即可进行更改.
  • SSIS(功能强大,但非常笨重且调试起来不好玩)

可以工作的东西,但不如正确完成的 TVP 灵活(即传入一个返回 IEnumerable<SqlDataRecord> 的方法)。这些没问题,但为什么将记录转储到临时表中只是为了将它们解析到目标中,而您可以全部内联完成?

  • BCP/OPENROWSET(BULK...)/BULK INSERT
  • .NET 的 SqlBulkCopy

关于c# - 更新数千条记录的最有效方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28332158/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com