我将大量记录加载到我的应用程序中(超过 100 万条)并对它们进行大量处理。处理需要它们全部位于内存中。
之后,我想将所有(现已修改的)记录转储到一个空表中。
加载记录只需要几秒钟,我最终会得到一大堆MyRecord
items.
保存使用SqlBulkCopy
也只需几秒钟。
However SqlBulkCopy
需要(我相信)DataTable
- 并将我的记录加载到DataTable
速度很慢 - 每分钟大约 7500 条记录
dataTable.Rows.Add(myRecord.Name, myRecord.Age, ....)
有没有更快的方法来执行这个中间步骤?
造成延迟的原因是您必须将所有内容缓冲到数据表中,然后再将其发送到服务器。为了获得更好的性能,您应该立即将记录发送到 SqlBulkCopy,并让该类使用自己的缓冲和批处理。
SqlBulkCopy 可以与 IDataReader 一起使用。所有 ADO.NET 数据读取器都实现此接口,因此您可以将从任何数据读取器读取的数据推送到 SqlBulkCopy。
在其他情况下,假设您有一个 IEnumerable 对象,您可以使用 Marc Gravel 的 ObjectReader快速会员包以在 IEnumerable 之上创建 IDataReader。该数据读取器可以not一次加载所有内容,因此在 SqlBulkCopy 请求之前不会缓存任何数据:
复制 Marc Gravel 的示例:
IEnumerable<SomeType> data = ...
using(var bcp = new SqlBulkCopy(connection))
using(var reader = ObjectReader.Create(data, "Id", "Name", "Description"))
{
bcp.DestinationTableName = "SomeTable";
bcp.WriteToServer(reader);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)