处理每一行并使用C#将其复制到新表

c# sqlbulkcopy sql-server sql-server-2008

我有一个MSSQL 2008表,有几百万条记录。我需要迭代每一行,修改一些数据,并使用每天执行的C#应用​​程序将更新的记录复制到新表。

我曾尝试使用ADO.NET实体执行此操作,但此方法涉及内存问题,更不用说它非常慢。我已阅读有关将一个表复制到另一个表的批量复制库和仅SQL的方法,但它们都不涉及在复制之前修改记录。我需要找到一种更好的方法来执行此操作。

一般承认的答案

当你提到内存问题时,我猜你正在尝试将百万行加载到内存中,处理它们然后将它们写回数据库。您可以通过“流式传输”数据而不是完全加载数据来避免这种情况。 SqlDataReader将为您处理缓冲,因此在读取端您可以执行一个简单的WHILE循环,逐个获取行。您已经使用的实际转换似乎所有您需要做的就是将结果写回数据库。恕我直言,最快的方法是在数据表中存储多个结果的缓冲区(以100开头,处理并查看最佳位置),然后使用SqlBulkCopy类将该数据表推送到数据库中。冲洗并重复。

PS:听起来像一个“有趣”的问题。您是否有任何样本数据可以在某处进行测试?对于一开始看起来微不足道的事情来说,5个小时听起来像是一个很长的时间,然后再多达2000万次,几乎没有任何东西可以加起来。更具体地说,我想知道RTF方面的数据“大”:平均值是2k还是200k?你运行什么样的硬件?


热门答案

执行速度最快的选项是将C#应用程序逻辑重新编写到CLR存储过程中,以便所有处理都在服务器上进行。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因