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

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

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

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

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


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


。。。。。。。。。。。

类似这样大数据量处理,诚心请教解决方案。

作者: jxyxhz   发布时间: 2011-06-02

也许我应该想个办法,在查询过程中剔除已经存在的数据。。。

作者: jxyxhz   发布时间: 2011-06-02

看着300分来帮顶,不懂,没个思路

作者: woying5510   发布时间: 2011-06-02

菜鸟观望,学习学习。

作者: chenhongjun0624   发布时间: 2011-06-02

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

作者: leaohong   发布时间: 2011-06-02

今天我也做的循环,可是数据量不大,我的方法很笨,做一张测试表B, 先把数据插入B,然后cross join 找B跟原插入表,找出相同数据,然后根据相同数据删除原数据表对应的列,然后再执行那24W条插入原数据表

作者: bleach001   发布时间: 2011-06-02


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

作者: Lisliefor   发布时间: 2011-06-02

需要通过循环生成24w条数据插入到另一个表

要循环生成24W

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

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

结构式啥样子的

引用 4 楼 leaohong 的回复:

问题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

反正用sp处理就对了,硬让程序干不可能不慢的,不过倒是好跟踪维护

作者: leaohong   发布时间: 2011-06-02

我是从sp转到代码逻辑来的。
sp就不用多说了。处理逻辑能力太差。

作者: jxyxhz   发布时间: 2011-06-02

作者: taomanman   发布时间: 2011-06-02

我把实际的场景简述下:

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

而查询2w条数据的时候还存在inner join等问题。

作者: jxyxhz   发布时间: 2011-06-02

引用 12 楼 taomanman 的回复:
你认识的

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

我在考虑,在实际业务操作过程中,是不是2w条数据都扔在内存里面一个个循环处理?

作者: jxyxhz   发布时间: 2011-06-02

也许下次数据量增多了以后就是5w*12,10w*24等。。。

一直多数据库大数据量处理方面不太会搞。。

作者: jxyxhz   发布时间: 2011-06-02

这个不用说肯定不考虑SP
参考

作者: wtj2832   发布时间: 2011-06-02

大批量的数据导入导出操作基本都用bcp
再,生成数据之前就判断重复不行?导入导出只是单纯的数据操作,这样bcp会很快。

作者: wszhoho   发布时间: 2011-06-02

对2W的数据源分页,同时在查询和插入的简单逻辑使用sp,这样可以在程序中监控sp执行情况,效率也不差。

作者: leaohong   发布时间: 2011-06-02

引用 16 楼 wtj2832 的回复:
这个不用说肯定不考虑SP
参考


大批量数据你不用sp试试,不过lz这个数据量实在不大,怎么都行啦

作者: leaohong   发布时间: 2011-06-02

帮顶!

作者: kk297173176   发布时间: 2011-06-02

帮顶 ,学习学习。

作者: syb1045   发布时间: 2011-06-02

菜鸟来观摩学习!

作者: yw39019724   发布时间: 2011-06-02

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

作者: Rock870210   发布时间: 2011-06-02

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


谢谢,有参考价值。

作者: jxyxhz   发布时间: 2011-06-02

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


谢谢,有参考价值。

这样不好处理的一点就是如果有外键,那删除表就比较麻烦。反而需要把24W数据再导回去2W的表中。
不过即使这样,也比比较一条往2W表中插入一条要好

作者: Rock870210   发布时间: 2011-06-02

我记得以前是先建同结构的临时表表,去掉主键等约束仅保留结构,从目标表导入既有数据,然后插入运算得到的数据

目标表上要建有唯一索引,把临时表往里一导重复自然就没了

作者: truecoffeefox   发布时间: 2011-06-02

帮顶,赚分

作者: blueskyzc   发布时间: 2011-06-02

引用 23 楼 rock870210 的回复:

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


这个貌似可行!~不然数据量越来越多,你循环的太多。。。。貌似会出问题........

作者: chenlitong_521   发布时间: 2011-06-02

我是从sp转到代码逻辑来的。
sp就不用多说了。处理逻辑能力太差。

作者: cqchq   发布时间: 2011-06-02

 帮顶。

作者: haojuntu   发布时间: 2011-06-02

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

作者: truecoffeefox   发布时间: 2011-06-02

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


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

作者: jxyxhz   发布时间: 2011-06-02

路过。。瞧瞧。。

作者: ymq_0000   发布时间: 2011-06-02

2w数据循环生成24w数据插入新表
这个新表里之前是有数据的?
判断存在不存在?存在怎么处理,不存在就插入。
2w数据第二遍循环的时候,里面已经都存在了,怎么处理,自动+1呀还是怎样?

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

正常判断存不存在的,都是分两步走,保证小数据量的索引和查询速度。
然后分2步批量执行:
1、插入不存在的。
2、更新存在的。

作者: maco_wang   发布时间: 2011-06-02

引用 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

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


t2的唯一索引

作者: truecoffeefox   发布时间: 2011-06-02

先用数据生成SQL.TEXT文件,然后导进去执行不知道成不

作者: flyerwing   发布时间: 2011-06-02

哦,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

帮楼主顶

作者: li520na   发布时间: 2011-06-02