关于一个数据导入的性能问题!!!!!!
我有5万条数据要导入,数据库里的数据是10W,我导入数据要先判断是否与数据库重复,
如果重复不导入相应的数据,没有导入的给出错误提示!请问大家有什么好的解决方法??我现在慢死了!!!!
------解决方案--------------------可在数据库中设置唯一键等约束,
若程序再判断大量数据导入,性能损失非常大
------解决方案--------------------同意楼上
------解决方案--------------------如果数据量这么大的时候还去判断是否有重复的话,肯定会慢 的不行了,
建议 1 楼所说,同时,对有重复的记录定会抛出异常,获取这个异常要比你一个一个的判断
效率要高的多,不过这里的异常可是要分情况讨论的,不然就不能做到你要的效果了,
希望对LZ有启发。
------解决方案--------------------如1楼所说,是最直接的办法。楼上解释的也很好
------解决方案--------------------我遇到过楼主这样的问题,甚至更加复杂,判断是否重复的时候不仅根据姓名与邮箱,还要根据姓名和电话来判断是否有重复,电话又可能是家庭电话或者是单位电话,这个判断过程就很复杂。我不是通过设置唯一约束来解决的,这样子的话满足不了我的要求,因为唯一性指定了某些列,而我的是这些列中不能有几列重复。
我的建议是:
1、如果一次导入数据量过大,那么可以分批导入,比如一次导入1000条。
2、代码的优化。当初我是将待导入的数据放在DataTable 中,一条条的写入到数据库.写入时注意你的SQL 构造语句,如果插入每条记录都用"Insert into .."的话千万不要用String类型创建过多的对象耗尽内存,用StringBuilder,当然如果列数固定那么用存储过程就好了,传参时注意就好了。
------解决方案--------------------什么数据库?
oracle中有 merge into这样的语法
------解决方案--------------------2楼 3楼都说完了 只能帮顶了
------解决方案--------------------估计楼住用的是程序吧
估计你是一次插入一条数据,首先判断是否重复,然后再插入吧
建议分批构造sql,比如几千条,重复判断在sql里解决,尽量减少数据库往还的次数,别忘了构造语句使用StringBuilder
------解决方案--------------------
------解决方案--------------------全导入先,然后把重复的删除了就行了
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
另一种方法是一个字段重复,ID不重复
delete 表 where id not in(
SELECT MAX(id) AS id FROM 表 GROUP BY rows) --- 删除重复行
select * from 表 where id in(
SELECT MAX(id) AS id FROM 表 GROUP BY rows) --重复行只查询一条