数据库存储_批量入库

这里是关于批量数据入库操作的疑问。

在java代码里我们一般都是用statement的executeBatch方法实现批量数据入库操作。

还有一种SQL方式:insert into test(id,name) values('1','Jerry'),('2','Tom'),.....('n','Neo');这样看来,只要拼接好一条SQL,通过statement的execute方法就能实现批量插入操作。但是一般平台开发都不会用这种方式。

请教下大家有没有研究过,这两种方式在数据中时怎么解析的?
batch操作,是不是就是将一批SQL同时提交给数据库,然后一条条执行?
而values方法,如果有多个()值,数据库又是怎么操作的?

总而言之,这两者的效率差别如何?
ps:自己做了些测试,但是随着批量操作的数据量不同,得到的耗时结果不一样,比较疑惑。

 

下面是论坛里搜到的问答:

解答一:

一般的数据库服务器的结构分为sql解析器和sql执行器。
请求到了服务器以后,首先要对sql做语法解析,检查有无错误,权限是否对等等等操作,然后再把编译好的指令发到执行器,由执行器来进行内存/硬盘io 对数据进行操作。

executeBatch省下的是数据库链接操作的时间,请求是批量提交到服务器的,经过解析器的解析之后,再逐条发送至执行器。

insert多个value,也不用取得很多次数据库链接(不论是创建还是池化),流程和以上一样,多个value我觉得应该是语法糖,执行器应该还是会逐条的处理。

以上分析建立在,执行器不能一次执行多条指令的基础上。这一块我确实没有深究过,如果有错误,希望大牛来指正。

LZ实测不同的效率来源,我觉得是,insert的静态语句会占用大量内存,这在数据膨胀的情况下应该还是会造成很大影响,如果是prepared的batch就不会有这个问题。

综上,还是batch比较好。

解答二:

在JDBC这,肯定是values多组值快了,都不需要控制事务,解析成sql,直接发给数据库就好了。
在数据库这里,语句的时间复杂度应该是一样的,那就是比jdbc拆sql快还是数据库拆sql快,从这点看,我猜values多组值快。
但不同数据库的特性是不一样的,比如oracle有共享sql,我不知道jdbc的实现能不能用的上,如果能batch会很快。

相关测试数据:

这边测试用的db2,数据量少于1000时,多个values方式比较快,超过5000条时batch块很多。(以上数字只是个大概,可能还跟表的字段数有关)随着数据量增加,batch效率明显高于多values方式。
另外,似乎不是所有的数据库都支持多values方式

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值