【问题标题】:Bulk insert c# datatable to sql server - Efficient check for duplicate将 c# 数据表批量插入到 sql server - 有效检查重复
【发布时间】:2014-02-19 00:38:11
【问题描述】:

我希望将许多文件导入数据库(使用自定义业务逻辑阻止简单的 SSIS 包使用)。

问题的高级描述:

  • 将现有的 sql 数据拉入 DataTable(~1M 行)
  • 将excel文件一次性读入二维数组
  • 逐行验证字段(自定义逻辑)
  • 检查现有 DataTable 中的重复项
  • 插入数据行
  • 将 DataTable 批量插入 SQL 表中

我的方法有问题: 必须检查每一行是否有重复,我认为调用远程服务器来利用 SQL 会太慢,所以我选择了 LINQ。查询很简单,但数据集的大小导致它需要爬网(90% 的执行时间花费在此查询检查字段上)。

var existingRows = from row in recordDataTable.AsEnumerable()
                                 where row.Field<int>("Entry") == entry
                                 &&    row.Field<string>("Device") == dev
                                 select row;
bool update = existingRows.Count() > 0;

还有哪些其他方法可以更有效地检查重复项?

【问题讨论】:

  • 我的第一个想法是,您可能应该放弃Count() 以支持Any()。然后我意识到你可能会在整个数据集上循环它,在这种情况下,你可能最好使用Distinct()Union()

标签: c# sql-server linq


【解决方案1】:

使用 linq,每次检查重复项时,它基本上都会对大约 1M 记录执行 for 循环。

最好将数据放入字典中,以便根据内存索引进行查找。

【讨论】:

  • 谢谢,我在想一些类似的事情,但我不确定 LINQ 是否对这种事情进行了任何优化,或者它是否只是一个美化的 foreach 循环
  • 理想情况下,我希望解决方案从查询中返回实际行,但我想我可以存储数据行号的键值对,然后手动检索它。会玩一玩,看看能有什么收获。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
相关资源
最近更新 更多