关于大量数据插入数据库的问题

谷林 2014-01-03 11:18:33
目前有一个需求,用户需要在短时间内将几万条数据导入 MSSQL 数据库。

如果有一条无法导入,需要知道是哪条数据出的错。

导入之前最好还要根据条件验证一下数据是否存在,存在就删除。

现在我一条一条判断导入,非常缓慢。

请问有什么好的思路么?


谢谢
...全文
711 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pricks 2014-06-12
  • 打赏
  • 举报
回复
引用 1 楼 ldh911 的回复:
1、所有数据导入临时表; 2、用一句SQL实现:删除临时表中目标表已经存在的记录;或者你把重复记录插入另一张表也行; 3、用一句SQL实现:将临时表中的数据全部插入目标表; 如果第3步仍然存在出错可能,则编写存储过程,用游标操作插入过程,插入失败的则插入另一张临时表(相当于记录所有插入失败的记录)。
这个办法不错的,楼主照做即可。
alexander0729 2014-06-12
  • 打赏
  • 举报
回复
1. 从什么地方导入到什么地方 2. 这个尽可能的快,是一个什么样的时间 3. 不管怎样, 一条一条的一定是慢的, 而且占CPU 4. 上面有个兄弟说 sqlbulkcopy, 这个不错 5. mssql有个功能叫做 DTS, 你可以了解下
  • 打赏
  • 举报
回复
你慢在搜索上。每次检查会相当消耗资源 1.如果数据有关键字段,能表示重复 比如用户ID号userid。那么把这个字段userid做唯一索引(插入的时候进行try catch 遇到重复会自动被catch,你就知道哪条重复了)被插入的永远都是不重复的 2.如果没有关键字段,所有字段合并做MD5值,单独加个字段叫md 做成唯一索引,然后try catch,原理和1相同 数据库的插入效率很高,搜索效率却很低。主要你要扫描的记录会越来越多,所以搜索会慢。避免搜索就变线性时间了。 (几万条数据,玩的还算比较少,我用这个办法玩过1000万的数据)
真爱无限 2014-01-16
  • 打赏
  • 举报
回复
实际是几万条也不算太多啦,我做过类似的,如果一个时间内连续插入数据,mssql占用cpu会达到90以上,导致网站不响应,所以我建议你每次循环插入时每插入1000条(几千条也行),就暂停个1、2秒,这样可能情况会好一点。。。
插曲 2014-01-10
  • 打赏
  • 举报
回复
既然你现在已经是一条一条正在跑的状态,只是为了提升效率,我建议不改动太大逻辑了 因为改动多了又需要测试,更何况是换一种新的逻辑结构,比较容易出错,也会增加工作量 如果现在你闲慢,那我觉得你可以考虑直接开启多线程一块跑,多开几个一会就跑完了。 MSSQL 处理几万数据量还是很容易的,MSSQL 也是很强大的 楼上说的办法虽然都是可行的,不过需要你自己评估时间和工作量 办法还有很多很多 望楼主早日解决困扰
leo_leon 2014-01-10
  • 打赏
  • 举报
回复
引用 1 楼 ldh911 的回复:
1、所有数据导入临时表; 2、用一句SQL实现:删除临时表中目标表已经存在的记录;或者你把重复记录插入另一张表也行; 3、用一句SQL实现:将临时表中的数据全部插入目标表; 如果第3步仍然存在出错可能,则编写存储过程,用游标操作插入过程,插入失败的则插入另一张临时表(相当于记录所有插入失败的记录)。
强力支持!
梦在旅途 2014-01-09
  • 打赏
  • 举报
回复
引用 楼主 liu86815 的回复:
目前有一个需求,用户需要在短时间内将几万条数据导入 MSSQL 数据库。 如果有一条无法导入,需要知道是哪条数据出的错。 导入之前最好还要根据条件验证一下数据是否存在,存在就删除。 现在我一条一条判断导入,非常缓慢。 请问有什么好的思路么? 谢谢
引用 2 楼 u011235251 的回复:
用这个吧,sqlbulkcopy,批量导入大量数据, 在导入之前写好事务处理, 在用try{}catch{}判断处理,返回的弹出提示框即可。。
先使用2楼的方法sqlbulkcopy导入到临时表,然后再使用1楼的方法,使用SQL语句删除重复的行,最后插入即可!
xiaohe345 2014-01-03
  • 打赏
  • 举报
回复
用这个吧,sqlbulkcopy,批量导入大量数据, 在导入之前写好事务处理, 在用try{}catch{}判断处理,返回的弹出提示框即可。。
MiceRice 2014-01-03
  • 打赏
  • 举报
回复
1、所有数据导入临时表; 2、用一句SQL实现:删除临时表中目标表已经存在的记录;或者你把重复记录插入另一张表也行; 3、用一句SQL实现:将临时表中的数据全部插入目标表; 如果第3步仍然存在出错可能,则编写存储过程,用游标操作插入过程,插入失败的则插入另一张临时表(相当于记录所有插入失败的记录)。
发帖
高性能WEB开发

2.5w+

社区成员

高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
帖子事件
创建了帖子
2014-01-03 11:18
社区公告
暂无公告