有个语句块,逻辑挺简单,就是往一张表中插入几条数据,但是基数很大,具体语句如下
declare  i int:=13900000000;
   begin
   loop
   insert into users_mobile(mobile,create_time) values(to_char(i),sysdate);
   exit when i=1390000010;
   i:=i+1;
   end loop;
   end;
语句执行的时候,非常慢,执行了8分钟左右还执行部完,只好手动停止了。
如果基数改的比较小,那速度很快,请问这个问题怎么解决?

解决方案 »

  1.   

    declare  i int:=13900000000;
    exit when i=1390000010;
    13900000000
    1390000010
    这怎么会退出啊?
    你就是换个再牛逼的机器,也执行不完
      

  2.   

    你赋值declare  i int:=13900000000这个比下面的退出条件值( exit when i=1390000010)还大。
    你把赋值语句改小一下再试试。
      

  3.   

    SORRY,是写错了,应该是exit when i = 13999999999;
      

  4.   

    像你这种需求,纯粹意义上是插入数值的。我建议你用序列号,每次取序列号的下一个值(nextval)就好了,这比你用循环要快。
      

  5.   

    频繁使用inser是 比较费时间的,你可以试一试 50条数据插一次 ,或是100条数据插一次
      

  6.   

    就算是用SEQUENCE,那么如何不用循环呢
      

  7.   

     insert into users_mobile(mobile,create_time) values(序列名.nextval,sysdate);
      

  8.   

    insert into users_mobile(mobile,create_time) select 13900000000+rownum,sysdate from dual connect by rownum<=10;
      

  9.   

    这个我感觉是不是应该插入一部分后commit一下,是不是会有效果。
      

  10.   


    用SEQUENCE就不用循环了, insert into .... select SEQUENCE.next_val as seq_Val,.... 
    where seq_Val> 13900000000 and seq_Val <= 13900009999 
      

  11.   

    pl/sql引擎和sql引擎的切换次数太多了!!!
      

  12.   

    提供两种优化思路:
    1:做分批插入,每插入N条之后提交事物;
    2:insert语句可以如此写:insert /*+ APPEND */ ,可以减少归档日志;