用于批量传输的 MySqlDataAdapter 或 MySqlDataReader?

标签 mysql sql-server sqlbulkcopy

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

有没有人在使用以下其中一项时体验到比其他项更好的性能?

  • DataAdapter 并以 500 block 为单位调用 Fill 到 DataTable
  • DataReader.以 500 次循环读取 DataTable

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

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

如有任何帮助,我们将不胜感激!

最佳答案

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

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

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

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

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

关于用于批量传输的 MySqlDataAdapter 或 MySqlDataReader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2768828/

相关文章:

mysql - 使用 ORDER BY 时如何减少 sql 查询时间

sql - SQL Server 中的 Case 语句

postgresql - 使用 PostgreSQL COPY 时为 "ERROR: extra data after last expected column"

c# - SQLBulkCopy 抛出 InvalidOperationException 可空整数

c# - 名称函数在当前上下文中不存在 C# 错误

使用希伯来语语言时,类似 PHP 的查询找不到任何结果

php - 编码行出现在每个关闭的 div 之后。 (仅在 DOM 检查器中)

mysql - 如何通过控制台导入数据库转储 .sql 文件

java - 每天将数百万条记录从 sql server 移动到 oracle

sql-server - 我可以从 View 中动态调用存储过程吗?