oracle批量插入SQL优化

最近在实现一个读取本地文件数据,解析后插入数据库功能,数据量大概是三百万,文件大小将近500MB,采用批量插入的方式进行处理。
之前使用比较多的是mysql,第一次接触oracle,比较习惯使用foreach循环来做处理,最开始的做法是把insert语句放到foreach里面,sql如下:

insert into t_userinfo (id,name,sex)values(t_userinfo_s.NEXTVAL,#{userInfo.name},#{userInfo.sex})

t_userinfo_s.NEXTVAL为表的序列号。
这样写功能实现没问题,但是当测试数据大时,效率低就提现出来了,平均每一千条数据都要1300ms的时间,三百万数据跑完基本上要一个多小时。
这个时间肯定没法接受,在网上找了一些资料,网上比较常见的建议是使用oracle的append,但是这个方法会导致表被锁住,只适合做表数据初始化使用,不太适合经常需要执行的sql语句。
最后还是决定把insert的逻辑移出foreach中,在foreach里面只保留需要插入的值,更改后的sql如下:

insert into t_userinfo (id,name,sex)selectt_userinfo_s.NEXTVAL,#{userInfo.name},#{userInfo.sex} from dual

使用这个sql,单条插入没有问题,但是一旦多条插入,就会获取不到序列号,在百度上找了一些资料,最好的办法是在数据库增加一条函数,用函数来处理。
但是我不想改动数据库,所以采用曲线救国方式,先把序列号查找出来,然后把序列号直接赋值给userInfo的id,这样就不需要在sql里面去获取序列号ID了。更改后的sql如下:

insert into t_userinfo (id,name,sex)select#{userInfo.id},#{userInfo.name},#{userInfo.sex} from dual 

这样改完之后,再测试,一千条的数据插入时间基本上保持在250ms左右,三百兆的数据基本上16分钟可以搞定,这个优化虽然不是最好,但也在可以接受的范围内。
若大家有更好的SQL,欢迎分享~~

你可能感兴趣的:(oracle批量插入SQL优化)