我从数据库查找了100W条数据放到DataTable里,然后导入Excel的时候,一条条去对比DataTable里的数据,看是否存在。
代码:dt.Select(" A_ASIN ='" + ASIN + "' and A_Date ='" + DateTime + "' ")
发现这个搜索比较慢
我测试过,从数据库查询100W条数据到DataTable里大概只需要5-8秒,但是我导入的Excel可能有10万条,每次去执行dt.Select 需要一定的时间,这个时间累加起来,就很慢了。
有什么其他办法可以快速查找吗?
另外一种思路是,直接一条条去查数据库,但是我导入一份Excel可能有10万条数据,我总不能去查10万次数据库吧?
1.将需要导入数据库的数据从Excel导入到一张表,这个表就当临时表用 假设表2
2.假设表1为你原有数据表
3.取得表一的集合,取得表2的集合。
4.集合与集合之间去对比。这里的数据你已经拿出来了,遇到不同的Add进去就行,相同的不添加。我不知道你用的是什么数据库,有没有模型之类的。List泛型儿有distinct的。
ps:也可以将表2的数据逐条去表一查询,按照你规定的是同一条数据的约束条件查询,没有找到的话,那就是不相同,插入。然后从表2删掉这条。
下次再次导入的时候删掉表2所有的数据,全部导入。
上面这个方案还是可以的, 把Excel里数据先导入到一个临时表里, 然后 insert into rawTable select * from excelTable where not exists (select rawtable where rawtable.id=exceltable.id),这样子全放到数据库里操作是绝对要快于你读取到程序中再处理好,而且你读取到DataTable处理过程中,这100W数据在数据库中发生了变化呢,这么多数据处理时间太长,加事务锁表这也是不太好!
查询到DataTable时就用sql做到对比吧,然后DataTable得到的10W条就是导入Excel的10W条。
为什么不能呢?
导入数据这种事情你难道天天做?每个小时做?
能完成工作,运行速度没有任何意义的时候,优化是无用功。
用 SqlBulkCopy 把DataTable插入临时表,再用sql对比临时表插入更新。
考虑把筛选放到数据库中,datatable中只存储需要导入的数据,然后用SqlBulkCopy(如果是导入到Sql Server)来进行导入.
你这里其实是datatable.select来对比数据比较慢,优化这块。
可以给datatable加主键,或者转成Dictionary
你可以参考这位大神的意见,我之前做千万条数据对比的时候找到的
http://www.cnblogs.com/yangecnu/archive/2013/05/20/3087896.html
绝对有用
你可以这样:如果不需要实时的,直接导入 10W,弄一个定时任务,或者导入完之后直接 SELECT 重复的数据进行 DELETE