【300分】批量插入数据问题。
需要通过循环生成24w条数据插入到另一个表,插入的时候还需要判断一下这条数据是否已经存在。
问题1:是否一开始就查询出2w条数据然后再做循环,还是类似分页查询一样查一部分循环,然后做处理,然后提交。然后再查一部分。。。如此循环?
问题2:关键的逻辑问题还是查询的量太大,然后插入之前需要判断拿当前数据去判断下,这个比较费时。
问题3:必然引起超时问题,虽然sqlBulkCopy也许可以解决插入问题,整体上应该处于设计问题。。。
。。。。。。。。。。。
类似这样大数据量处理,诚心请教解决方案。
作者: jxyxhz 发布时间: 2011-06-02
作者: jxyxhz 发布时间: 2011-06-02
作者: woying5510 发布时间: 2011-06-02
作者: chenhongjun0624 发布时间: 2011-06-02
问题2:查询量真的不大,让SP遍历去查询和插入,为查询条件建立索引会很有效,当然索引也会影响插入的效率,如何取舍要看显示需求
问题3:用job或者多线程去执行sp,不存在超时问题
作者: leaohong 发布时间: 2011-06-02
作者: bleach001 发布时间: 2011-06-02
循环生成24w条数据,放到临时表,生出数据的时候,把重复的数据过滤掉?感觉这个时间比较长,有需求要求有用户界面来操作吗?
不能用数据库job来跑?
作者: Lisliefor 发布时间: 2011-06-02
要循环生成24W
插入的时候还需要判断一下这条数据是否已经存在。
可不可以在生成24W之前来判断是否存在啊。
结构式啥样子的
问题1:2w条数据并不多,问题在于存在哪里,这种情景一般不要用程序去处理,应该用sp处理
问题2:查询量真的不大,让SP遍历去查询和插入,为查询条件建立索引会很有效,当然索引也会影响插入的效率,如何取舍要看显示需求
问题3:用job或者多线程去执行sp,不存在超时问题
24万就不用多线程了 1个线程20万已经够了。 几万一个事务。
JOB应该不考虑吧
作者: wxr0323 发布时间: 2011-06-02
关注 学习
作者: qydvip 发布时间: 2011-06-02
不过我觉得还是可以多线程的
不知道表结构是什么样子的
你的表结构的ID如果多线程可能要考虑主键的问题
如果不用的话不用太多考虑
作者: fengyarongaa 发布时间: 2011-06-02
作者: leaohong 发布时间: 2011-06-02
sp就不用多说了。处理逻辑能力太差。
作者: jxyxhz 发布时间: 2011-06-02
作者: taomanman 发布时间: 2011-06-02
业务数据表:2w+的数据量,需要生成台账,每个月1条(插入台账表),时间的区间为你自己选择,所以如果你选择1月-12月的话就需要生成24w条数据。但是其间某些数据可能单独生成过并审核过了。也不需要再插入了(判断是否存在)
而查询2w条数据的时候还存在inner join等问题。
作者: jxyxhz 发布时间: 2011-06-02
你认识的
像高歌这些做法和测试我都看过相关资料。
我在考虑,在实际业务操作过程中,是不是2w条数据都扔在内存里面一个个循环处理?
作者: jxyxhz 发布时间: 2011-06-02
一直多数据库大数据量处理方面不太会搞。。
作者: jxyxhz 发布时间: 2011-06-02
参考
作者: wtj2832 发布时间: 2011-06-02
再,生成数据之前就判断重复不行?导入导出只是单纯的数据操作,这样bcp会很快。
作者: wszhoho 发布时间: 2011-06-02
作者: leaohong 发布时间: 2011-06-02
这个不用说肯定不考虑SP
参考
大批量数据你不用sp试试,不过lz这个数据量实在不大,怎么都行啦
作者: leaohong 发布时间: 2011-06-02
作者: kk297173176 发布时间: 2011-06-02
作者: syb1045 发布时间: 2011-06-02
作者: yw39019724 发布时间: 2011-06-02
插入完成后把另外2W数据导入该表,删掉2W表,把该表更名为删掉的2w那张表名
不晓得这样可以不!
作者: Rock870210 发布时间: 2011-06-02
先建一个同样结构的表,然后插入24W数据,插入前判断2W数据那张2W表是否有重复的,有则不插入,
插入完成后把另外2W数据导入该表,删掉2W表,把该表更名为删掉的2w那张表名
不晓得这样可以不!
谢谢,有参考价值。
作者: jxyxhz 发布时间: 2011-06-02
引用 23 楼 rock870210 的回复:
先建一个同样结构的表,然后插入24W数据,插入前判断2W数据那张2W表是否有重复的,有则不插入,
插入完成后把另外2W数据导入该表,删掉2W表,把该表更名为删掉的2w那张表名
不晓得这样可以不!
谢谢,有参考价值。
这样不好处理的一点就是如果有外键,那删除表就比较麻烦。反而需要把24W数据再导回去2W的表中。
不过即使这样,也比比较一条往2W表中插入一条要好
作者: Rock870210 发布时间: 2011-06-02
目标表上要建有唯一索引,把临时表往里一导重复自然就没了
作者: truecoffeefox 发布时间: 2011-06-02
作者: blueskyzc 发布时间: 2011-06-02
先建一个同样结构的表,然后插入24W数据,插入前判断2W数据那张2W表是否有重复的,有则不插入,
插入完成后把另外2W数据导入该表,删掉2W表,把该表更名为删掉的2w那张表名
不晓得这样可以不!
这个貌似可行!~不然数据量越来越多,你循环的太多。。。。貌似会出问题........
作者: chenlitong_521 发布时间: 2011-06-02
sp就不用多说了。处理逻辑能力太差。
作者: cqchq 发布时间: 2011-06-02
作者: haojuntu 发布时间: 2011-06-02
作者: truecoffeefox 发布时间: 2011-06-02
刚才试了我说的方法,建立唯一索引,忽略重复,直接往里插入即可,重复自然忽略,不必导来到去,如果是ms sql
贴出你的测试代码给我测试下。。。
作者: jxyxhz 发布时间: 2011-06-02
作者: ymq_0000 发布时间: 2011-06-02
这个新表里之前是有数据的?
判断存在不存在?存在怎么处理,不存在就插入。
2w数据第二遍循环的时候,里面已经都存在了,怎么处理,自动+1呀还是怎样?
建议给出表结构,和要插入的表的结构,及详细的处理规则。
正常判断存不存在的,都是分两步走,保证小数据量的索引和查询速度。
然后分2步批量执行:
1、插入不存在的。
2、更新存在的。
作者: maco_wang 发布时间: 2011-06-02
引用 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
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
t2的唯一索引
作者: truecoffeefox 发布时间: 2011-06-02
作者: flyerwing 发布时间: 2011-06-02
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
作者: li520na 发布时间: 2011-06-02