【问题标题】:MySqlDataAdapter or MySqlDataReader for bulk transfer?用于批量传输的 MySqlDataAdapter 或 MySqlDataReader?
【发布时间】:2010-05-04 20:40:08
【问题描述】:

我正在使用 .NET 的 MySql 连接器将数据从 MySql 服务器复制到 SQL Server 2008。

有没有人使用以下方法之一体验到更好的性能?

  • DataAdapter 并以 500 个块调用 Fill 到 DataTable
  • DataReader.Read 以 500 次循环读取 DataTable

然后我使用 SqlBulkCopy 加载 500 个 DataTable 行,然后继续循环,直到 MySql 记录集被完全传输。

我主要关心的是使用合理数量的内存并在短时间内完成。

任何帮助将不胜感激!

【问题讨论】:

  • 您愿意发布您的解决方案吗?我目前需要将大量数据从 MySQL 移动到 MSSQL,并在使用 DataTable.Fill(MySQLDataReader) 填充数据表时遇到 OutOfMemoryException。您的解决方案可能会为我节省大量时间。

标签: mysql sql-server sqlbulkcopy


【解决方案1】:

我没有使用过 SqlBulkCopy,但根据一般经验法则,DataReader 通常会提供更好的性能。

可以在底层查询仍在返回记录时处理 DataReader(因此您不必等待查询完成即可开始处理数据)。 DataReader 将在数据可用时立即返回数据,我相信默认情况下只会将活动记录存储在内存中(而不是完整的结果集),从而减少内存使用量。

DataAdapter 将完整的结果集加载到 DataTable/DataSet 中,由于信息在内存中的存储方式以及额外的关联状态(想想 rowstate 等),这将产生更高的开销。

如果我只读取数据,我将始终使用 DataReader 而不是 DataAdapter...如果我在任何一点上错了,请有人纠正我?

无论如何,SqlBulkCopy 似乎只遍历记录并且不使用 DataTable 进行任何优化(根据 Reflector),所以我认为 DataReader 是您最好的选择。

【讨论】:

    【解决方案2】:

    在处理大量数据时,我使用 SqlBulkCopy 和 DataReader。我发现该过程在速度和内存使用方面非常有效,因为在复制之前不会检索整个数据集。我建议将 BatchSize 属性设置为某个合理的值,在您的情况下为 500。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-28
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多