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

时间:2012-04-02 22:40:28

标签: c# sql-server sql-server-2008 sqlbulkcopy

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

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

4 个答案:

答案 0 :(得分:3)

性能最快的选项是将您的C#应用​​程序逻辑重新编写为CLR stored procedure,以便所有处理都在服务器上进行。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

在互联网上查看,将富文本转换为纯文本看起来Microsoft's official answer就是将数据加载到RichTextBox控件中,然后使用RichTextBox.Text属性将其拉出来。这很糟糕,但主要是因为这意味着你必须弄脏手。您最好的办法是编写一个调用RichTextBox控件的小应用程序,并将所有数据传入/传出数据库(使用SqlDataReader可以缓解您提到的内存问题。)

就过程问题而言 - 我建议建立一个中间表,你的"清理"数据行在将它们附加到生产表之前会被转储。一旦你得到了正确的存储过程,你就可以创建一个触发器,每次将记录添加到脏表时自动调用存储过程。这最终将消除每天运行程序以移动记录的需要,因为触发器将确保它在运行中发生#34;。

编辑 - 最后一个想法

我想到你可能不习惯编写存储过程和触发器,这没关系。更多"程序化"解决方案是将脏表中的所有文件放到分隔的文本文件中,可以轻松下载和解析。获得文本文件后,您可以使用您的应用程序对其进行操作(读取,清理,创建一个已清理的文件......你有什么用),然后上传以便读回数据库。根据您的舒适度/背景/技能水平,这实际上可能是完成工作的更好解决方案。

希望这有帮助!

答案 3 :(得分:1)

使用SSIS。安排进行转换的日常工作并运行SSIS包。这将负责批处理和内存消耗,并将提供一些fast connectors for the read and write of data。您可以将自定义C#代码(RTF剥离为纯文本)作为SSIS组件嵌入,请参阅Developing Custom Objects for Integration Services