如题:   有一个文件 20万条记录;
XXX批次的数据
ID,UserId,UserMoney
1,100001,12.34
2,100001,15.34
3,100001,13.34
5,100001,17.34
6,100001,12.34
7,100001,15.34
8,100001,13.34
9,100001,17.34
10,100001,17.34。文件读入Stringlist,这个过程时间很短;一个文件读入入库Project一条记录;然后
接下来,我要把这个内容拆分成 5条内容合成一个记录,然后再入另外一个库User;更新 Project库的拆分进度
  
也就是 20万 除以 5 = 4万条记录入库
这个过程拆分入库
100001,1,5
100001,6,10 我的方法好像非常笨:
 for 1 to 200000 do
   begin
      ID := StringList[0];
      UserID := StringList[0];
      UserMoney := UserMoney  + StrToInt(StringList[0]);
      //入库
      事务开始
      SQL.add('Insert Into User(StartID,EndID,SumMoney,UserID) Values()。');
      SQL.add('Update Porject ') //更新记录,标示拆分到第几行了
      事务提交
   end;//过程是这样的,代码不是完整,我仅仅说了简单的入库过程,我测试了,大概每秒钟入库也就几十条;很慢
4万条记录,入库需要好长时间;不知道还有没有优化的地方

解决方案 »

  1.   

    用导入导出工具把你要导入的文件导到txt文档 用平面文件源进行导入
      

  2.   

    你把FOR 去掉 直接写语句试试。不行就把执行计划贴出来看看
      

  3.   

    lz这样的入库,有很多相关表的处理,一般都做在存储过程里面。这样也好维护。前台来跑循环,会有慢的问题的。 建议lz把20W数据提交给一个临时表,然后由后台存储过程处理你这些数据的更新,插入等操作。
    前台只监控结果即可。 
      

  4.   

     SQL.add('Update Porject ') //更新记录,标示拆分到第几行了 更新动作速度慢,想办法不要update,或者整批只更新一次
      

  5.   

    SQL.add('Update Porject ') //更新记录,标示拆分到第几行了 更新动作速度慢,想办法不要update,或者整批只更新一次 
    Re : 只更新一次貌似不合理,因为在拆分的过程中,如果出现异常系统 将无法知道拆分的具体位置!
      

  6.   

    建个这个的表tb
    ID UserId UserMoney 
    把数据全部导入之后再处理select min(id) as StartID,
    max(id) as EndID,
    sum(UserMoney) as SumMoney,
    UserID
    from tb
    group by (id-1)/5
      

  7.   

     
    OrchidCatlz这样的入库,有很多相关表的处理,一般都做在存储过程里面。这样也好维护。 前台来跑循环,会有慢的问题的。 建议lz把20W数据提交给一个临时表,然后由后台存储过程处理你这些数据的更新,插入等操作。 
    前台只监控结果即可。 Re:把20万的数据 导入到临时表如何写?
    如果这样,那20万数据 ,入库到临时表是不是也是要耗时的
      

  8.   

    20万的数据时从 txt 文件里读取的
      

  9.   

    用导入导出导入数据.如果不用导入导出,也不要每次一条的插入
    可先将要插入的记录生成四个长的字符串,每个字符串中包含40000条insert语句
    分四次执行.
    如果是字符串太长,系统不接受,可考虑缩短.如一条1000条
    这样会更快,一次一条是最慢的了.