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>

7个回答

另外,你只插入一张表,为什么要把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,让其一次执行多条插入

snailgo556
华华的世界 回复liian2018: oracle是不支持 这种的,mysql才支持
大约一年之前 回复
m0_37986661
liian2018 好的 谢谢你 大佬 这下学到了
一年多之前 回复

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

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

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

m0_37986661
liian2018 取数据是从别的表取的 这个表只要插入
一年多之前 回复

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

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问