用户名: 密码: 忘记密码? 注册
收藏此问题 发表新评论

【300分】批量插入数据问题。

现而今有一个需求是一个表里面有2w条数据。

需要通过循环生成24w条数据插入到另一个表,插入的时候还需要判断一下这条数据是否已经存在。

问题1:是否一开始就查询出2w条数据然后再做循环,还是类似分页查询一样查一部分循环,然后做处理,然后提交。然后再查一部分。。。如此循环?

问题2:关键的逻辑问题还是查询的量太大,然后插入之前需要判断拿当前数据去判断下,这个比较费时。


问题3:必然引起超时问题,虽然sqlBulkCopy也许可以解决插入问题,整体上应该处于设计问题。。。


。。。。。。。。。。。

类似这样大数据量处理,诚心请教解决方案。
昵称: jxyxhz  时间: 2011-06-02 14:31:50
也许我应该想个办法,在查询过程中剔除已经存在的数据。。。
昵称: jxyxhz  时间: 2011-06-02 14:36:07
看着300分来帮顶,不懂,没个思路
昵称: woying5510  时间: 2011-06-02 14:39:06
菜鸟观望,学习学习。
昵称: chenhongjun0624  时间: 2011-06-02 14:39:57
问题1:2w条数据并不多,问题在于存在哪里,这种情景一般不要用程序去处理,应该用sp处理
问题2:查询量真的不大,让SP遍历去查询和插入,为查询条件建立索引会很有效,当然索引也会影响插入的效率,如何取舍要看显示需求
问题3:用job或者多线程去执行sp,不存在超时问题
昵称: leaohong  时间: 2011-06-02 14:40:28
今天我也做的循环,可是数据量不大,我的方法很笨,做一张测试表B, 先把数据插入B,然后cross join 找B跟原插入表,找出相同数据,然后根据相同数据删除原数据表对应的列,然后再执行那24W条插入原数据表
昵称: bleach001  时间: 2011-06-02 14:40:36

循环生成24w条数据,放到临时表,生出数据的时候,把重复的数据过滤掉?感觉这个时间比较长,有需求要求有用户界面来操作吗?
不能用数据库job来跑?

昵称: Lisliefor  时间: 2011-06-02 14:42:26
需要通过循环生成24w条数据插入到另一个表

要循环生成24W

插入的时候还需要判断一下这条数据是否已经存在。

可不可以在生成24W之前来判断是否存在啊。

结构式啥样子的

引用 4 楼 leaohong 的回复:

问题1:2w条数据并不多,问题在于存在哪里,这种情景一般不要用程序去处理,应该用sp处理
问题2:查询量真的不大,让SP遍历去查询和插入,为查询条件建立索引会很有效,当然索引也会影响插入的效率,如何取舍要看显示需求
问题3:用job或者多线程去执行sp,不存在超时问题


24万就不用多线程了 1个线程20万已经够了。 几万一个事务。

JOB应该不考虑吧
昵称: wxr0323  时间: 2011-06-02 14:44:28
有个想法,可以先操作重复数据删除后 把剩下的数据导入文本,然后一次行插入 不知道行不行!
关注 学习
昵称: qydvip  时间: 2011-06-02 14:48:00
二十几万的数据量不算太多
不过我觉得还是可以多线程的
不知道表结构是什么样子的
你的表结构的ID如果多线程可能要考虑主键的问题
如果不用的话不用太多考虑
昵称: fengyarongaa  时间: 2011-06-02 14:48:03
反正用sp处理就对了,硬让程序干不可能不慢的,不过倒是好跟踪维护
昵称: leaohong  时间: 2011-06-02 14:48:52
我是从sp转到代码逻辑来的。
sp就不用多说了。处理逻辑能力太差。

昵称: jxyxhz  时间: 2011-06-02 14:49:22
你认识的
昵称: taomanman  时间: 2011-06-02 14:51:37
我把实际的场景简述下:

业务数据表:2w+的数据量,需要生成台账,每个月1条(插入台账表),时间的区间为你自己选择,所以如果你选择1月-12月的话就需要生成24w条数据。但是其间某些数据可能单独生成过并审核过了。也不需要再插入了(判断是否存在)

而查询2w条数据的时候还存在inner join等问题。
昵称: jxyxhz  时间: 2011-06-02 14:53:51
引用 12 楼 taomanman 的回复:
你认识的

像高歌这些做法和测试我都看过相关资料。

我在考虑,在实际业务操作过程中,是不是2w条数据都扔在内存里面一个个循环处理?
昵称: jxyxhz  时间: 2011-06-02 14:56:20
也许下次数据量增多了以后就是5w*12,10w*24等。。。

一直多数据库大数据量处理方面不太会搞。。
昵称: jxyxhz  时间: 2011-06-02 14:57:43
这个不用说肯定不考虑SP
参考
昵称: wtj2832  时间: 2011-06-02 14:58:04
大批量的数据导入导出操作基本都用bcp
再,生成数据之前就判断重复不行?导入导出只是单纯的数据操作,这样bcp会很快。
昵称: wszhoho  时间: 2011-06-02 14:58:06
对2W的数据源分页,同时在查询和插入的简单逻辑使用sp,这样可以在程序中监控sp执行情况,效率也不差。
昵称: leaohong  时间: 2011-06-02 14:59:44
引用 16 楼 wtj2832 的回复:
这个不用说肯定不考虑SP
参考


大批量数据你不用sp试试,不过lz这个数据量实在不大,怎么都行啦
昵称: leaohong  时间: 2011-06-02 15:01:10
帮顶!
昵称: kk297173176  时间: 2011-06-02 15:02:48
帮顶 ,学习学习。
昵称: syb1045  时间: 2011-06-02 15:08:02
菜鸟来观摩学习!
昵称: yw39019724  时间: 2011-06-02 15:13:31
先建一个同样结构的表,然后插入24W数据,插入前判断2W数据那张2W表是否有重复的,有则不插入,
插入完成后把另外2W数据导入该表,删掉2W表,把该表更名为删掉的2w那张表名
不晓得这样可以不!
昵称: Rock870210  时间: 2011-06-02 15:14:52
引用 23 楼 rock870210 的回复:
先建一个同样结构的表,然后插入24W数据,插入前判断2W数据那张2W表是否有重复的,有则不插入,
插入完成后把另外2W数据导入该表,删掉2W表,把该表更名为删掉的2w那张表名
不晓得这样可以不!


谢谢,有参考价值。
昵称: jxyxhz  时间: 2011-06-02 15:17:05
引用 24 楼 jxyxhz 的回复:
引用 23 楼 rock870210 的回复:
先建一个同样结构的表,然后插入24W数据,插入前判断2W数据那张2W表是否有重复的,有则不插入,
插入完成后把另外2W数据导入该表,删掉2W表,把该表更名为删掉的2w那张表名
不晓得这样可以不!


谢谢,有参考价值。

这样不好处理的一点就是如果有外键,那删除表就比较麻烦。反而需要把24W数据再导回去2W的表中。
不过即使这样,也比比较一条往2W表中插入一条要好
昵称: Rock870210  时间: 2011-06-02 15:24:34
我记得以前是先建同结构的临时表表,去掉主键等约束仅保留结构,从目标表导入既有数据,然后插入运算得到的数据

目标表上要建有唯一索引,把临时表往里一导重复自然就没了
昵称: truecoffeefox  时间: 2011-06-02 15:27:55
帮顶,赚分
昵称: blueskyzc  时间: 2011-06-02 15:29:51
引用 23 楼 rock870210 的回复:

先建一个同样结构的表,然后插入24W数据,插入前判断2W数据那张2W表是否有重复的,有则不插入,
插入完成后把另外2W数据导入该表,删掉2W表,把该表更名为删掉的2w那张表名
不晓得这样可以不!


这个貌似可行!~不然数据量越来越多,你循环的太多。。。。貌似会出问题........
昵称: chenlitong_521  时间: 2011-06-02 15:30:48
我是从sp转到代码逻辑来的。
sp就不用多说了。处理逻辑能力太差。

昵称: cqchq  时间: 2011-06-02 15:31:23
 帮顶。
昵称: haojuntu  时间: 2011-06-02 15:33:26
刚才试了我说的方法,建立唯一索引,忽略重复,直接往里插入即可,重复自然忽略,不必导来到去,如果是ms sql
昵称: truecoffeefox  时间: 2011-06-02 15:41:57
引用 31 楼 truecoffeefox 的回复:
刚才试了我说的方法,建立唯一索引,忽略重复,直接往里插入即可,重复自然忽略,不必导来到去,如果是ms sql


贴出你的测试代码给我测试下。。。
昵称: jxyxhz  时间: 2011-06-02 15:50:50
路过。。瞧瞧。。
昵称: ymq_0000  时间: 2011-06-02 15:54:22
2w数据循环生成24w数据插入新表
这个新表里之前是有数据的?
判断存在不存在?存在怎么处理,不存在就插入。
2w数据第二遍循环的时候,里面已经都存在了,怎么处理,自动+1呀还是怎样?

建议给出表结构,和要插入的表的结构,及详细的处理规则。

正常判断存不存在的,都是分两步走,保证小数据量的索引和查询速度。
然后分2步批量执行:
1、插入不存在的。
2、更新存在的。
昵称: maco_wang  时间: 2011-06-02 16:07:21
引用 32 楼 jxyxhz 的回复:

引用 31 楼 truecoffeefox 的回复:
刚才试了我说的方法,建立唯一索引,忽略重复,直接往里插入即可,重复自然忽略,不必导来到去,如果是ms sql


贴出你的测试代码给我测试下。。。


汗,这个还要写代码

C# code
SqlConnection cn = new SqlConnection("Data Source=192.168.0.10;Initial Catalog=MCH;Persist Security Info=True;User ID=sa;Password=20096327"); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 20000; i++) { sb.Append(" insert into t1 values('test'); "); } SqlCommand cmd = new SqlCommand(sb.ToString(), cn); cn.Open(); cmd.ExecuteNonQuery(); string inserttext = " insert t2 select * from t1 "; cmd = new SqlCommand(inserttext, cn); cmd.ExecuteNonQuery();

玩了t2只有一行数据
昵称: truecoffeefox  时间: 2011-06-02 16:11:14
SQL code
declare @table table (id int) insert into @table select 1 union all select 2 declare @table2 table(id int) declare @i int set @i=0 while @i<12 begin insert into @table2 select * from @table set @i=@i+1 end select * from @table2 /* id ----------- 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 */

存在的怎么处理,我没有理解明白要什么样的结果...
昵称: maco_wang  时间: 2011-06-02 16:12:19

t2的唯一索引
昵称: truecoffeefox  时间: 2011-06-02 16:13:30
先用数据生成SQL.TEXT文件,然后导进去执行不知道成不
昵称: flyerwing  时间: 2011-06-02 16:16:55
哦,sql代码啊
declare @i int
set @i=0
while @i<20000
begin
insert into t1 values('test')
set @i=@i+1
end

insert into t2 select * from t1

select COUNT(a) from t1--2w
select COUNT(a) from t2--1
昵称: truecoffeefox  时间: 2011-06-02 16:18:19
帮楼主顶
昵称: li520na  时间: 2011-06-02 16:52:43
发表评论
昵称:
内容:
验证: