• 【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-

  • 相关阅读:
    pip安装指定版本的package
    学习 git基础命令
    美剧命名规则
    Mac OS X中bogon的处理
    学习Maven之Maven Clean Plugin
    学习Maven之Cobertura Maven Plugin
    博客园markdown代码块支持的语言
    学习Maven之Maven Surefire Plugin(JUnit篇)
    C# Invoke或者BeginInvoke的使用
    LINQ to SQL语句(20)之存储过程
  • 原文地址:https://www.cnblogs.com/heyang78/p/15230310.html
Copyright © 2020-2023  润新知