首页 新闻 会员 周边

几万条数据的循环查询和插入,数据库内百万级数据,怎么处理?

1
悬赏园豆:50 [已解决问题] 解决于 2017-10-09 15:22

现在有个比较棘手的问题,数据库中现存300W数据

隔几天需要一次性处理插入5W条左右的数据

每条数据都要判断数据库中是否存在

求大神赐教解决方案,现在处理一次都要大半个小时,有没有高性能的解决办法?

数据库是MS SQL server

大米DM的主页 大米DM | 初学一级 | 园豆:109
提问于:2014-12-30 22:35
< >
分享
最佳答案
0

这么点数据,不应该会这么慢。。还有,个人你建议你建立一个和主表一样的副表。然后每次用sqlbulkcopy将5w条数据写入副表,一般不会超过10s。然后在数据库中,利用sql来查询来取出有效数据,插入到主表即可。

收获园豆:50
幻天芒 | 高人七级 |园豆:37175 | 2014-12-31 08:41

Kevin.Choi | 园豆:3 (初学一级) | 2014-12-31 08:50

@Kevin.Choi: :) Tks~

幻天芒 | 园豆:37175 (高人七级) | 2014-12-31 09:02

@幻天芒: 顶你个肺啊,你看来也是经验丰富。

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-12-31 09:47

@爱编程的大叔: 再怎么说,也混迹好多年了嘛。虽然还是凄凄惨惨戚戚!

幻天芒 | 园豆:37175 (高人七级) | 2014-12-31 10:21
其他回答(9)
0

用什么字段判断数据是否存在?时间主要花费在判断存在还是在插入???

XiaoFaye | 园豆:3087 (老鸟四级) | 2014-12-31 06:08
0

很多要点你都没有提及

1、300万行数据,5万行数据,为什么要每条数据判断是否存在?

2、一行数据大约是多少个字段,或者说大约多少字符数。

3、如果判断字数据重复性?

4、服务器在远程还是近程。半个小时时间是如何分配的?检测用时,插入用时各占多少比例?

5、你的代码是什么样的,很多时候代码的杀伤力是最可怕的。可怕程度远远超过任何一个ORM相对于ADO.NET性能损失的几十几百倍。

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-12-31 08:09
0

300万数据不多,不过你要是一条一条插入,确实要这么久啊50000/1800 =30 一秒30条啊

Slark.NET | 园豆:692 (小虾三级) | 2014-12-31 08:18
1

 主要时间应该是花在判断是否数据存在

你可以对判断字段建立组合索引,跑多几条线程,把不存在的集合计算出来,再利用 SqlBulkCopy 插入

Yu | 园豆:12980 (专家六级) | 2014-12-31 08:32
0

个人觉得先通过sqlbulkcopy批量插入5W条数据,而后在数据库中操作 删除掉重复的数据。

KingMi | 园豆:1344 (小虾三级) | 2014-12-31 11:02
0

不管怎样先将数据放进去,然后一条去重复语句就搞定

迅捷网络[来送福利] | 园豆:576 (小虾三级) | 2015-01-02 10:15
1

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
PETER@@@ | 园豆:248 (菜鸟二级) | 2015-01-02 11:37

这个才是 最佳答案。楼主这样不合适!

支持(0) 反对(0) 大叔、 | 园豆:84 (初学一级) | 2018-06-26 15:15
0

查找上建立索引,先做是否存在判断。过滤后再使用sqlbuck批量插入。

.NET快速开发框架 | 园豆:946 (小虾三级) | 2015-01-04 13:48
-1

5楼真是高,我也学到了

树形图 | 园豆:4 (初学一级) | 2015-01-05 13:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册