现在有个比较棘手的问题,数据库中现存300W数据
隔几天需要一次性处理插入5W条左右的数据
每条数据都要判断数据库中是否存在
求大神赐教解决方案,现在处理一次都要大半个小时,有没有高性能的解决办法?
数据库是MS SQL server
这么点数据,不应该会这么慢。。还有,个人你建议你建立一个和主表一样的副表。然后每次用sqlbulkcopy将5w条数据写入副表,一般不会超过10s。然后在数据库中,利用sql来查询来取出有效数据,插入到主表即可。
顶
@Kevin.Choi: :) Tks~
@幻天芒: 顶你个肺啊,你看来也是经验丰富。
@爱编程的大叔: 再怎么说,也混迹好多年了嘛。虽然还是凄凄惨惨戚戚!
用什么字段判断数据是否存在?时间主要花费在判断存在还是在插入???
很多要点你都没有提及
1、300万行数据,5万行数据,为什么要每条数据判断是否存在?
2、一行数据大约是多少个字段,或者说大约多少字符数。
3、如果判断字数据重复性?
4、服务器在远程还是近程。半个小时时间是如何分配的?检测用时,插入用时各占多少比例?
5、你的代码是什么样的,很多时候代码的杀伤力是最可怕的。可怕程度远远超过任何一个ORM相对于ADO.NET性能损失的几十几百倍。
300万数据不多,不过你要是一条一条插入,确实要这么久啊50000/1800 =30 一秒30条啊
主要时间应该是花在判断是否数据存在
你可以对判断字段建立组合索引,跑多几条线程,把不存在的集合计算出来,再利用 SqlBulkCopy 插入
个人觉得先通过sqlbulkcopy批量插入5W条数据,而后在数据库中操作 删除掉重复的数据。
不管怎样先将数据放进去,然后一条去重复语句就搞定
SQL server有个用户自定义表类型,你可以自定义个,然后两张表关联一下,把不重复的关联出来,批量insert into速度应该会很快,关于用户自定义表类型可以参考下:http://www.loowe8.com/334.html
当然也可以采用临时表进行数据传送,但是绝对不能一条条去比较是否重复,我的建议是先全部提交到数据库,用用户定义表类型或者临时表,然后建传送的表与实际的数据表进行left join筛选不重复的
假设你传的表是Tabel1 ,要更新的表是Mytable,假设都有字段a,相同的不插入,
insert into MyTable(a) select t1.a from Table1 t1 left join MyTable t2 on t1.a=t2.a where t2.a is null
这个才是 最佳答案。楼主这样不合适!
查找上建立索引,先做是否存在判断。过滤后再使用sqlbuck批量插入。
5楼真是高,我也学到了