liian2018
2018-08-22 01:50
采纳率: 50%
浏览 3.7k

Mybatis执行insert all 的时候 越来越慢是什么原因

情况描述:
数据库是Oracle
每次从表里取出10000条数据 进行计算 结果大概500~1000条 然后把这几百条数据批量插入数据库中 插入的表没有索引 就是很简单的几个字段
第一次执行 大概3S左右就插入成功了 第二次执行一下要50S左右 再往下越来越长。。不知道什么原因 有大佬遇到过吗
还有就是 当这个insert all变慢之后 对数据库进行 ddl操作都会卡死。。。而dml没有影响~
java这边数据库连接池用的druid

这是第一次
这是第二次
sql如下

 <insert id="batchInsertArriveInfo" parameterType="java.util.List" useGeneratedKeys="false">
    insert all
    <foreach collection="list" item="info" index="index">
      into
      T_ARRIVAL_STATION_INFORMATION
      (BUS_PATH_ID,STATION_SN,TASK_STATUS,ARR_TIME,BUS_PATH_NAME,RUN_FLAG,VEHICLE_ID,station_name,station_id)
      values
      (
      #{info.busPathId},#{info.stationSn},#{info.taskStatus},
      #{info.arrTime},#{info.busPathName},#{info.runFlag},
      #{info.vehicleId},#{info.stationName},#{info.stationId}
      )
    </foreach>
    select 1 from dual
  </insert>
  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • zhangpan_soft 2018-08-22 09:02
    已采纳

    另外,你只插入一张表,为什么要把into 放在循环里面?这相当于,每执行一次插入都开启一个io,你有多少资源可以开启?改为

    
    <insert id="batchInsertArriveInfo" parameterType="java.util.List" useGeneratedKeys="false">
        insert all
    
          into
          T_ARRIVAL_STATION_INFORMATION
          (BUS_PATH_ID,STATION_SN,TASK_STATUS,ARR_TIME,BUS_PATH_NAME,RUN_FLAG,VEHICLE_ID,station_name,station_id)
          values
                <foreach collection="list" item="info" index="index" separator=",">
          (
          #{info.busPathId},#{info.stationSn},#{info.taskStatus},
          #{info.arrTime},#{info.busPathName},#{info.runFlag},
          #{info.vehicleId},#{info.stationName},#{info.stationId}
          )
        </foreach>
        select 1 from dual
      </insert>
    
    

    改为上述,只打开一个io,让其一次执行多条插入

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • threenewbee 2018-08-22 02:00

    正因为插入的表没有索引,你取数据、插入都需要全表扫描,而且随着表越来越大,自然耗时越来越多,所以会越来越慢。

    评论
    解决 无用
    打赏 举报
  • 第一次3秒 第二次50s肯定不正常,看一下第一次插入后有没有将其单个关闭,是不是造成io阻塞。
    至于在操作期间使用数据库同样的表肯定无法操作 会卡死,因为程序操作的时候为了保持一致性 无法通过客户端操作

    评论
    解决 无用
    打赏 举报
  • _zming 2018-08-22 02:38

    应该是数据库本身问题,你可以尝试用纯粹jdbc进行操作便知

    评论
    解决 无用
    打赏 举报
  • 止戈uuu 2018-08-22 05:13

    因为数据库里面的数据会越来越多的呀,而且建立索引的话,在数据插入时还要构建索引,这个时间消耗是指数型倍增的,建议使用定时任务和读写分离的方式去解决

    评论
    解决 无用
    打赏 举报
  • zhangpan_soft 2018-08-22 08:51

    因为楼主用的是insert all语句,会整张表加锁,数据越多,自然效率越低,成指数递增

    评论
    解决 无用
    打赏 举报
  • zhangpan_soft 2018-08-22 09:08

    补充一点,insert all语句在插入多张表的时候,效果显著,就比如说,你相同的数据要同时插入到a表和b表则可以
    insert all into a ... into b ...,一张表没必要多次into,否则要values干什么?还不如不发明values只有一个value算了

    评论
    解决 无用
    打赏 举报
  • m0_51367595 2021-02-18 15:41

    楼上行不通

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题