公众号:Java小咖秀,网站:javaxks.com
作者:楼主楼主 , 链接: www.jianshu.com/p/cce617be9…
数据库使用的是 sqlserver,JDK 版本 1.8,运行在 SpringBoot 环境下
对比 3 种可用的方式
- 反复执行单条插入语句
- xml 拼接 sql
- 批处理执行
先说结论:少量插入请使用反复插入单条数据,方便。数量较多请使用批处理方式。(可以考虑以有需求的插入数据量 20 条左右为界吧,在我的测试和数据库环境下耗时都是百毫秒级的,方便最重要)。无论何时都不用 xml 拼接 sql 的方式。
代码
拼接 SQL 的 xml
newId() 是 sqlserver 生成 UUID 的函数,与本文内容无关
1 | ini复制代码<insert parameterType="java.util.List"> |
Mapper 接口
Mapper 是 mybatis 插件 tk.Mapper 的接口,与本文内容关系不大
1 | csharp复制代码public interface ItemMapper extends Mapper<Item> { |
Service 类
1 | scss复制代码@Service |
测试类
1 | swift复制代码@RunWith(SpringRunner.class) |
测试结果:
10 条 25 条数据插入经多次测试,波动性较大,但基本都在百毫秒级别
方式 | 50 条 | 100 条 | 500 条 | 1000 条 |
---|---|---|---|---|
批处理 | 159ms | 208ms | 305ms | 432ms |
xml 拼接 sql | 208ms | 232ms | 报错 | 报错 |
反复单条插入 | 1013ms | 2266ms | 8141ms | 18861ms |
其中 拼接 sql 方式在插入 500 条和 1000 条时报错(似乎是因为 sql 语句过长,此条跟数据库类型有关,未做其他数据库的测试):com.microsoft.sqlserver.jdbc.SQLServerException: 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。此 RPC 请求中提供了过多的参数。最多应为 2100
可以发现
- 循环插入的时间复杂度是 O(n), 并且常数 C 很大
- 拼接 SQL 插入的时间复杂度(应该)是 O(logn), 但是成功完成次数不多,不确定
- 批处理的效率的时间复杂度是 O(logn), 并且常数 C 也比较小
结论
循环插入单条数据虽然效率极低,但是代码量极少,在使用 tk.Mapper 的插件情况下,仅需代码,:
1 | typescript复制代码@Transactional |
因此,在需求插入数据数量不多的情况下肯定用它了。
xml 拼接 sql 是最不推荐的方式,使用时有大段的 xml 和 sql 语句要写,很容易出错,工作效率很低。更关键点是,虽然效率尚可,但是真正需要效率的时候你挂了,要你何用?
批处理执行是有大数据量插入时推荐的做法,使用起来也比较方便。
本文转载自: 掘金