首页 新闻 搜索 专区 学院

c#大批量Excel导入性能问题。

0
悬赏园豆:20 [待解决问题]

我从数据库查找了100W条数据放到DataTable里,然后导入Excel的时候,一条条去对比DataTable里的数据,看是否存在。

代码:dt.Select(" A_ASIN ='" + ASIN + "' and  A_Date ='" + DateTime + "' ")

发现这个搜索比较慢

我测试过,从数据库查询100W条数据到DataTable里大概只需要5-8秒,但是我导入的Excel可能有10万条,每次去执行dt.Select 需要一定的时间,这个时间累加起来,就很慢了。

有什么其他办法可以快速查找吗?

 

另外一种思路是,直接一条条去查数据库,但是我导入一份Excel可能有10万条数据,我总不能去查10万次数据库吧?

网子的主页 网子 | 初学一级 | 园豆:167
提问于:2016-01-12 15:38
< >
分享
所有回答(7)
0

1.将需要导入数据库的数据从Excel导入到一张表,这个表就当临时表用   假设表2
2.假设表1为你原有数据表
3.取得表一的集合,取得表2的集合。

4.集合与集合之间去对比。这里的数据你已经拿出来了,遇到不同的Add进去就行,相同的不添加。我不知道你用的是什么数据库,有没有模型之类的。List泛型儿有distinct的。
ps:也可以将表2的数据逐条去表一查询,按照你规定的是同一条数据的约束条件查询,没有找到的话,那就是不相同,插入。然后从表2删掉这条。

下次再次导入的时候删掉表2所有的数据,全部导入。

贫民窟大侠 | 园豆:4270 (老鸟四级) | 2016-01-12 16:31

上面这个方案还是可以的,     把Excel里数据先导入到一个临时表里,  然后 insert into rawTable select * from excelTable  where not exists (select rawtable where rawtable.id=exceltable.id),这样子全放到数据库里操作是绝对要快于你读取到程序中再处理好,而且你读取到DataTable处理过程中,这100W数据在数据库中发生了变化呢,这么多数据处理时间太长,加事务锁表这也是不太好!

支持(0) 反对(0) hokers | 园豆:201 (菜鸟二级) | 2016-01-17 16:53
0

查询到DataTable时就用sql做到对比吧,然后DataTable得到的10W条就是导入Excel的10W条。

wxl369 | 园豆:193 (初学一级) | 2016-01-12 16:32
1

为什么不能呢?

导入数据这种事情你难道天天做?每个小时做?

能完成工作,运行速度没有任何意义的时候,优化是无用功。

爱编程的大叔 | 园豆:30657 (高人七级) | 2016-01-12 16:37
1

用 SqlBulkCopy 把DataTable插入临时表,再用sql对比临时表插入更新。

jj91821 | 园豆:461 (菜鸟二级) | 2016-01-12 17:46
0

考虑把筛选放到数据库中,datatable中只存储需要导入的数据,然后用SqlBulkCopy(如果是导入到Sql Server)来进行导入.

幻天芒 | 园豆:36594 (高人七级) | 2016-01-13 08:44
0

你这里其实是datatable.select来对比数据比较慢,优化这块。

可以给datatable加主键,或者转成Dictionary

你可以参考这位大神的意见,我之前做千万条数据对比的时候找到的

http://www.cnblogs.com/yangecnu/archive/2013/05/20/3087896.html

绝对有用

紫炎 | 园豆:106 (初学一级) | 2016-01-13 15:33
0

你可以这样:如果不需要实时的,直接导入 10W,弄一个定时任务,或者导入完之后直接 SELECT 重复的数据进行 DELETE

反骨仔 | 园豆:444 (菜鸟二级) | 2017-05-27 23:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册