【MyBatis/Oracle】通过MyBatis执行Oracle的批量插入语句,插入千万数据进一表用时1h22m59s151ms

本文例程下载:https://files.cnblogs.com/files/heyang78/myBank210905_1834.rar

Oracle其实是全方位领先于同时期的MySQL,但在批量插入速度上被Linux版的MySQL给比下去了。另外Windows 5.X版的MySql别这样插值,有可能插着插着DB就不好用了,只能重装MySql。

 

Oracle的批量插入语法是这样的结构:

复制代码
Insert all

Insert into student(id,name) values ('1','XXX')

Insert into student(id,name) values ('2','XXX')

Insert into student(id,name) values ('3','XXX')

....

Insert into student(id,name) values ('n','XXX')

select * from dual
复制代码

其中n不是直接给1000,0000就行的,它与机器性能有关,在下面的程序里取200.

 

那么插一次的函数可以写成:

复制代码
    public String bunchInsert2(int min,int max) {
        
        StringBuilder sb=new StringBuilder();
        sb.append("INSERT ALL ");
        for(int i=min;i<max;i++) {
            sb.append("   INTO student(id, name) values('"+i+"','"+i+"')");
        }
        sb.append("select * from dual");
        String sql = sb.toString();
        
        return sql;
    }
复制代码

调用它的接口是:

@Mapper
public interface StudentMapper {
......    
    @SelectProvider(type=StudentSql.class,method="bunchInsert2")
    void bunchInsert2(int min,int max);
}

测试部分:

        for(int i=0;i<50000;i++) {
            int min=i*200;
            int max=(i+1)*200;
            
            stuMapper.bunchInsert2(min,max);
        }

执行完毕,为了检查不会有中间遗漏的ID,可以用这条SQL检查:

select b.seq from (select seq from (select level as seq from dual connect by level<=(select max(id) from student)) a where a.seq>=(select min(id) from student)) b where b.seq not in (select id from student);

如果结果是未选定行,那么创建的记录就是连续的。

用上面的程序跑完,我发现居然花了一小时二十二分钟,这比用dbms的方式可用时多多了。

前作:https://www.cnblogs.com/heyang78/p/11806720.html

-END-

posted @   逆火狂飙  阅读(472)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2020-09-05 如何手动合并ts视频文件
2019-09-05 Sql语法树示例 select username, ismale from userinfo where age > 20 and level > 5 and 1 = 1
2019-09-05 【高中数学/基本不等式】当x是正实数时,求函数f(x)=x/(1+x^2)的最大值?
2019-09-05 【Canvas与纹饰】环形小蜜蜂纹饰
2019-09-05 【高中数学/基本不等式】已知:x,y皆为正实数,且满足2x+y=1 求:1/x+1/y的最小值?
2019-09-05 [Tool]截屏利器FSCapture7.6下载
2019-09-05 [eclipse]如何修改Eclipse编辑器的字体
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示