我在存储过程中有个逻辑:按月(1-30天)有个循环,另从一个有3000条数据的表aa建立游标(需要循环该表记录),总共循环大约9万次,按月循环在外,游标循环在内,生成9万条新记录插入到另一表bb,循环一次插一条,共用了1个半小时,感觉太慢!请问各位有没有好的解决方案呢??
LOAD DATA INFILE好像在存储过程中不能使用!

解决方案 »

  1.   

    disable index可能会提高些速度.
      

  2.   

    结构说得再清晰一点。如果用两层循环的话感觉不如用cross join 或inner join 的方式更快。
    只要将条件判断清晰了。
      

  3.   

    我是让表aa中的3000条记录在一个月中的每天都生成一条新的记录(有一个字段“价格”每天都需要更新),插入到表bb中,所以会生成30*3000=9万条记录
      

  4.   

    就是感觉你这个存储过程是否可以不用游标,用insert select 的批量插入形式。将条件搞清晰一点,应该可以提速,可以把结构和过程发上来看一下。
      

  5.   

    我需要通过游标来循环更新“价格”那个字段啊,有的需要更新有的不需要  insert select  好像不好满足需求
      

  6.   

    更新的话选择多表更新方式
     update a inner join b on a.xx=b.xx
    set a.price = if (....,...,..) 
    想每次处理一百条就得建临时表之类的存储
      

  7.   

    Loop will speed up your insert.
      

  8.   

    推荐2个方案:
    1>方案一
    建立一个和bb表完全一样的cc表,同时该表去掉所有的索引
    运行存储过程:
     (1)清空cc表
     (2)插入9万条记录到cc表
     (3) insert into bb select * from cc
      将cc表所有的记录拷贝到bb表中(如果业务逻辑允许的话,可以再插入数据前关闭索引。数据拷贝完成后,重新恢复索引)2>方案二
    如果数据库服务器内存够多的话
    建立一个和bb表完全一样的cc"内存"表,同时该表去掉所有的索引(速度会快不少)其他步骤同第一方案最后多加一步,最后清空cc内存表,释放占用的内存