【Oracle/Java】以Insert ALL方式向表中插入百万条记录,耗时9分17秒
由于按一千条一插程序长期无反应,之后改为百条一插方式,运行完发现插入百万记录需要9m17s,虽然比MySQL效率差,但比单条插入已经好不少了。
对Oracle的批量插入语法不明的请参考:https://www.cnblogs.com/xiandedanteng/p/11806720.html
代码如下:
package com.hy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.MessageFormat;
/**
* 百万数据插入Oracle表中
* @author horn1
*
*/
public class MillionInserter {
// 连接到数据库的四大属性
private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String DBURL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
private static final String USER = "system";
private static final String PSWD = "XXXX";
public void batchInsert(int count) {
Connection conn = null;
Statement stmt = null;
try{
long startTime = System.currentTimeMillis();
Class.forName(DRIVER).newInstance();
conn = DriverManager.getConnection(DBURL, USER, PSWD);
stmt = conn.createStatement();
int BatchSize=100;
int index=0;
int times=count/BatchSize;
for(int i=0;i<times;i++) {
StringBuilder sb=new StringBuilder();
sb.append("INSERT ALL ");
for(int j=0;j<BatchSize;j++) {
index=i*BatchSize+j;
String name="M"+index;
int age=j % 100;
String raw=" INTO firsttb(NAME, age,createdtime) values(''{0}'',''{1}'',sysdate) ";
Object[] arr={name,age};
String particialSql=MessageFormat.format(raw, arr);
sb.append(particialSql);
}
sb.append("select * from dual");
String sql = sb.toString();
stmt.executeUpdate(sql);
System.out.println("#"+i+" "+BatchSize+" records inserted");
}
long endTime = System.currentTimeMillis();
System.out.println("Time elapsed:" + sec2DHMS((endTime - startTime)/1000) );
String sql = "select count(*) as cnt from firsttb";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
String cnt = rs.getString("cnt");
System.out.println("当前记录数:"+cnt);
}
} catch (Exception e) {
System.out.print(e.getMessage());
} finally {
try {
stmt.close();
conn.close();
} catch (SQLException e) {
System.out.print("Can't close stmt/conn because of " + e.getMessage());
}
}
}
/**
* 将秒转化为日时分秒
* @param secondCount
* @return
*/
private static String sec2DHMS(long secondCount) {
String retval = null;
long days = secondCount / (60 * 60 * 24);
long hours = (secondCount % (60 * 60 * 24)) / (60 * 60);
long minutes = (secondCount % (60 * 60)) / 60;
long seconds = secondCount % 60;
String strSeconds="";
if(seconds!=0) {
strSeconds=seconds + "s";
}
if (days > 0) {
retval = days + "d" + hours + "h" + minutes + "m" + strSeconds;
} else if (hours > 0) {
retval = hours + "h" + minutes + "m" + strSeconds;
} else if (minutes > 0) {
retval = minutes + "m" + strSeconds;
} else {
retval = strSeconds;
}
return retval;
}
/**
* 执行点
* @param args
*/
public static void main(String[] args) {
MillionInserter mi=new MillionInserter();
mi.batchInsert(1000000);
}
}
输出:
#9987 100 records inserted #9988 100 records inserted #9989 100 records inserted #9990 100 records inserted #9991 100 records inserted #9992 100 records inserted #9993 100 records inserted #9994 100 records inserted #9995 100 records inserted #9996 100 records inserted #9997 100 records inserted #9998 100 records inserted #9999 100 records inserted Time elapsed:9m17s 当前记录数:1000000

到此真正掌握了Oracle的Insert ALL语法,并确认了其真实效率,今天又取得了一个小小的突破,重走长征路又迈出了小小却坚实的一步。
表的表结构请见:https://www.cnblogs.com/xiandedanteng/p/11691113.html
--END-- 2019年11月9日11:19:01
【Oracle/Java】以Insert ALL方式向表中插入百万条记录,耗时9分17秒的更多相关文章
- Mysql命令insert into:向表中插入数据(记录)
insert into命令用于向表中插入数据. insert into命令格式:insert into <表名> [(<字段名1>[,..<字段名n > ])] v ...
- (笔记)Mysql命令insert into:向表中插入数据(记录)
insert into命令用于向表中插入数据. insert into命令格式:insert into <表名> [(<字段名1>[,..<字段名n > ])] v ...
- sql 中实现往表中插入一条记录并返回当前记录的ID
写一条存储过程,实现往User中插入一条记录并返回当前UserId(自增长id) --推荐写法 if(Exists(select * from sys.objects where name=N'Usp ...
- 【Oracle/Java】给十六张表各插入十万条数据 单线程耗时半小时 多线程耗时一刻钟
测试机Oracle版本: SQL> select * from v$version; BANNER ----------------------------------------------- ...
- Yii1 用commandBuilder方法往数据表中插入多条记录
$builder = Yii::app()->db->schema->commandBuilder; // 创建builder对象 $command = $builder->c ...
- oracle通过sql随机取表中的10条记录
oracle通过sql随机取表中的10条记录: SELECT * FROM (SELECT * FROM T_USER ORDER BY DBMS_RANDOM.RANDOM()) WHERE Row ...
- SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据
SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...
- MSSQL SELECT(刚刚)新插入到表中的那条记录
假设对表 TXxxxxxxx 表新插入一条记录,然后要 SELECT 出刚刚插入的这条记录.可使用 SCOPE_IDENEITY(); 处理.具体代码参考如下: INSERT INTO TXxxxxx ...
- 【java/oralce/sql】往一张仅有id,名称,创建时间三个字段的表中插入百万数据需要多久?1分26秒
代码下载:https://files.cnblogs.com/files/xiandedanteng/fastfilltable20191222.rar 表testtb18的结构如下: CREATE ...
随机推荐
- 【SpringMVC】拦截器
一.概述 1.1 拦截器的异常场合 1.2 拦截器中的方法 二.示例 2.1 定义两个拦截器 2.2 配置拦截器 2.3 执行顺序 三.拦截器应用 3.1 需求 3.2 用户登陆及退出功能开发 3.3 ...
- JAVA中为什么要使用接口,继承接口不是还要重写方法吗?为什么不直接写那些方法呢?:::接口的最主要的作用是达到统一访问
接口的最主要的作用是达到统一访问 那么什么叫统一访问呢 举个例子 你这样想,我做一个USB接口,有个读的抽象方法 那叫read()吧,然后mp3类实现,U盘类实现,移动硬盘类实现,这样我用的时候用US ...
- 【DevOps】在Rancher2中启动Docker-Registry仓库服务
准备 拥有Rancher2环境,已经在Rancher2配置Kubernetes集群 拥有域名,拥有SSL证书,可以自行在阿里云申请 启动Docker-Registry仓库服务 第一步:进入集群应用 第 ...
- MySQL服务器2
1.sql的基本语法 对数据库 create database db1; 创建数据库 对表: create database t1(id int,name char(10)); 创建表 show cr ...
- Mybatis3.0_动态SQL元素:foreach-遍历集合_
foreach-遍历集合 -笔记要点 <!--foreach 遍历标签 collection : 指定要遍历的集合; list类型的参数会特殊处理封装在Map中,map的key就叫做list; ...
- XSLT可扩展样式表语言转换 System.Xml.Xsl、XslCompiledTransform类
XML文件 books.xml: <?xml version="1.0" encoding="utf-8" ?> <bookstore> ...
- PL/SQL 子查询
一.概述 在一个SQL语句中嵌套另一个SQL语句成为子查询.包括单行子查询,多行子查询,多列子查询. 注意,当在DDL语句中引用子查询时,可以带有Order By子句:但是当在where子句.Set子 ...
- java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/Workbook] with root cause
一.问题描述 使用POI上传excel,本地可正常运行,开发服务器上报错. 二.异常信息如下: 2019-05-05 17:00:22,349 ERROR [http-nio-8080-exec-7] ...
- jQuery 中的事件和动画
一.jQuery中的事件 1.加载DOM 以浏览器装载文档为例,在页面加载完毕后,浏览器会通过JavaScript为DOM元素添加事件.在常规JavaScript代码中,通常使用window.onlo ...
- 在mysql中用int类型存储IP
SELECT INET_ATON( '127.0.0.1' ); SELECT INET_NTOA();