gpt4 book ai didi

java - 优化 oracle jdbc 批量插入

转载 作者:搜寻专家 更新时间:2023-11-01 00:58:36 29 4
gpt4 key购买 nike

我需要使用 JDBC 向 Oracle-DB 中进行大量插入,即两位数百万。为此,我使用类似以下类的东西,灵感来自 Efficient way to do batch INSERTS with JDBC :

public class Inserter {
private final int batchSize;
private final Connection con; // with .setAutoCommit(false)
private final PreparedStatement ps;
private int currentSize = 0;

public Inserter(Connection con, PreparedStatement ps, int batchSize) {
this.con = con;
this.ps = ps;
this.batchSize = batchSize;
}

public void addInsert(Object[] vals) throws SQLException {
ps.clearParameters(); // should be redundant, but better safe than sorry
for (int i = 0; i < val.length; i++) {
this.ps.setObject(i + 1, vals[i]);
}
ps.addBatch();
currentSize++;

if (currentSize >= batchSize) {
ps.executeBatch();
currentSize = 0;
}
}

public void flush() {/** to flush leftovers */}
}

虽然这种插入方式工作正常,但速度非常慢。 JDBC batch insert performance描述了如何从根本上为 MySQL 处理这个确切的问题,因为 rewriteBatchedStatements 在 Oracle 上似乎不存在,它在这里没有太大帮助。

为了提高性能,我还尝试将语句切换为一个大的INSERT ALL .../INSERT APPEND ... 语句,根据Oracle 11g - most efficient way of inserting multiple rows ,这让一切变得更慢。

因此,我的问题是除了简单地使用 addBatch()executeBatch() 之外,是否还有任何方法可以优化这些插入?或者在上面的 Inserter 类中可能存在一些严重的、低效的错误?非常感谢任何帮助。


更多可能有用的信息:

  • 要插入的表已分区,每个分区大约有 1 到 1000 万行。

  • 表中有一个唯一约束,看起来像这样 unique(id1, id2, id3, id4) 其中所有列的类型都是 NUMBER 并通过外键约束进一步绑定(bind)到其他表中的主键。


编辑:

根据评论中的建议,我将 setObject(index, val) 调用切换为:

  1. setInt(index, val), setFloat(index, val), ..., setNull( index, type) 在适当的地方调用

  2. setObject(index, val, type)setNull(index, typR)

这两个版本都没有显着提高性能。

此外,我尝试将数据插入到临时表中而没有任何限制,这也没有带来更好的性能。

相比之下,将数据导出到 CSV 并使用 SQL*Loader 加载它可以显着提高性能,即对于最慢的表1,每秒约 4.5k => ~50k+ 行。

这让我相信瓶颈在于 JDBC。

1唉,在我的特殊情况下,使用 SQL*Loader 不是一个(理想的)选项。

最佳答案

你永远不会提交批处理。如果有可能在 executeBatch 之后添加提交如果查询未提交,您将创建大的回滚段,这会减慢速度下数据库。还要删除 ps.clearParameters() 因为您总是覆盖所有参数或不覆盖任何参数。最好使用专门版本的 setter 而不是 setObject

关于java - 优化 oracle jdbc 批量插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54445373/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com