【问题标题】:It's 2014, is there an elegant way to insert loads of rows of data yet?现在是 2014 年,是否有一种优雅的方式来插入大量数据行?
【发布时间】:2014-02-13 19:15:34
【问题描述】:

我从第 3 方的网络服务接收大量数据并将其提取到我们的数据库中。

数据量将代表 100,000 行,每晚运行,需要在应用程序服务器上进行处理,然后才能插入/合并到我的 sql 数据库中。我想到了一些批量插入的选项。

  1. 实体框架 - 花费的时间太长,因为它似乎一次发送一个插入命令!
  2. StringBuilder 和 SqlCommand - 听起来更好
  3. 将我想要插入的对象列表的 XML 序列化发送到一个存储过程,该存储过程使用 nodes() 将所有值获取到 INSERT/MERGE。

我一直更喜欢数字 3 并多次使用它,但它似乎仍然令人不快,而且在 internetz 上似乎并不为人所知,所以想知道是否有其他人解决这个问题的新方法或标准方法。

顺便说一句,我使用 .NET 堆栈。

【问题讨论】:

  • 您是否尝试过其中一种可用于数据加载的工具,例如 BULK INSERT、bcp、SSIS?它们已经存在很长时间了,可以在几分钟内处理数百万行。您提到的选项实际上被认为是不良做法
  • 您能否指出我讨论为什么将 XML 方式视为实践的某个地方。我很感兴趣,因为我仍在使用它

标签: c# asp.net sql entity-framework ado.net


【解决方案1】:

我最近一直在看这个。我最初使用 SqlBulkCopy 将其全部存储在 DataTable 中并以这种方式发送。

问题在于接收表需要为空,因此占用大量内存。

最后我使用了表值参数(SQL 2008)。

【讨论】:

  • 您可以使用 DataReader 和 SqlBulkCopy 来保留内存
  • 但是当数据读取器正在为 SqlBulkCopy 提供数据时,我仍然坐在内存中的巨大数据表中,这就是我遇到的问题。还是我猜错了数据阅读器的位置。有链接吗?
  • 您可以使用 DataReader 而不是 dataTable 来提供 SqlBulkCopty,从而节省内存,因为 DataReader 是流式传输的
  • 我将几百万行下载到特定的文本文件中,然后将它们上传到 SQL。我没有意识到我可以将 DataReader 直接指向文本文件。我猜是 OleDbConnection?
  • 不,有些库可以读取 csv 文件并将它们公开为 DbDataReader,例如 codeproject.com/Articles/9258/A-Fast-CSV-Reader
【解决方案2】:

您可以在sqlServer 2008及以上版本中使用Table Valued parameters进行批量插入;

【讨论】:

  • 可以肯定 TVP 直到 2008 年才出现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 2015-07-10
  • 2014-02-10
  • 2021-06-09
  • 1970-01-01
相关资源
最近更新 更多