【发布时间】:2011-06-21 13:56:33
【问题描述】:
我有一个带有 Oracle 数据库后端的 Java 应用程序,我需要在其中插入多行。我看过关于 inserting multiple rows into Oracle 的讨论,但我也对混合使用 JDBC 对性能的影响感兴趣。
我看到了一些可能性:
选项 1: 使用单行插入 PreparedStatement 并多次执行:
String insert = "Insert into foo(bar, baz) values (?, ?)";
PreparedStatement stmt = conn.prepareStatement(insert);
for(MyObject obj : someList) {
stmt.setString(1, obj.getBar());
stmt.setString(2, obj.getBaz());
stmt.execute();
}
选项 2: 构建一个 Oracle INSERT ALL 语句:
String insert = "INSERT ALL " +
"INTO foo(bar, baz), (?, ?) " +
"INTO foo(bar, baz), (?, ?) " +
"SELECT * FROM DUAL";
PreparedStatement stmt = conn.prepareStatement(insert);
int i=1;
for(MyObject obj : someList) {
stmt.setString(i++, obj.getBar());
stmt.setString(i++, obj.getBaz());
}
stmt.execute();
选项 3: 使用 PreparedStatement 的 addBatch 功能:
String insert = "Insert into foo(bar, baz) values (?, ?)";
PreparedStatement stmt = conn.prepareStatement(insert);
for(MyObject obj : someList) {
stmt.setString(1, obj.getBar());
stmt.setString(2, obj.getBaz());
stmt.addBatch();
}
stmt.execute();
我猜另一种可能性是创建一个 CSV 文件并使用 SQL 加载器,但我不确定如果加上创建 CSV 文件的开销,这是否真的会更快...
那么哪个选项的执行速度最快?
【问题讨论】:
-
请分享您的测量结果。请注意,Oracle 对批处理大小有限制。如果我没记错的话,一次是1000条记录,所以你需要每1000条记录调用
executeBatch()。相关:stackoverflow.com/questions/2467125/… -
我已经成功地使用了 2500 的批量大小,但我还没有看到超过 500 大小的实际性能提升
-
我在 12c 上使用了 1,000,000 的批量大小,并且看到与 1,000 或 10,000 或 100,000 个记录批次大致相同的记录/秒比率。但是,我也强制插入并行。
标签: oracle jdbc performance