【问题标题】:what more can be done to improve performance on bulk insert on SAP HANA DB using batchExecute() JDBC可以做些什么来提高使用 batchExecute() JDBC 在 SAP HANA DB 上进行批量插入的性能
【发布时间】:2019-11-20 11:01:04
【问题描述】:

我想插入超过一百万条记录,我正在使用下面的代码 sn-p 来做同样的事情。

final int batchSize = 5000;
int count = 0;
int rows = 2000000;

try {
    con = getConnection();
    String psBatchquery = "insert into SYSTEM.Employee (id, name) values (?,?)";
    batchPs = con.prepareStatement(psBatchquery);

    psBatchstart = System.currentTimeMillis();

    for (int i = 0; i < rows; i++) {
        batchPs.setInt(1, i);
        batchPs.setString(2, "Name" + i);

        batchPs.addBatch();

        if (++count % batchSize == 0) {
            //the reason I added below try catch is because I do not want to stop execution of other records if there is any error record.
            try {
                batchPs.executeBatch();
            } catch (BatchUpdateException a) {
                a.printStackTrace();
            }
        }
    }
    batchPs.executeBatch();
} catch (BatchUpdateException a) {
    a.printStackTrace();
} catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

使用上述参数大约需要 - 212349 毫秒。

1) 还可以做些什么来提高性能? 2)什么应该是最佳batchSize?如果我将 batchSize 减少到 100,则花费的时间会更多 3)我没有明确承诺,因为我不想回滚非错误记录。将 autocommit 设置为 false 并在最后一批执行后手动提交是否有助于减少执行时间? 4) 来自https://help.sap.com/viewer/0eec0d68141541d1b07893a39944924e/2.0.02/en-US/109397c2206a4ab2a5386d494f4cf75e.html 的参数 splitBatchCommands 是否有助于提高性能?

【问题讨论】:

标签: insert sap bulkinsert hana


【解决方案1】:

根据您的数字,代码插入 ca。每秒 9.4 条记录,确实很慢。

代码中需要注意的一点是它没有指定autocommit 模式,这意味着它使用HANA 的默认值:autocommit = ON

因此,在每个命令之后,都会执行一次提交。 根据您的描述,在我看来您实际上并不想要那个,所以添加

 con.setAutoCommit(false);

对我来说似乎是很好的第一步。

如果之后性能仍然很差,我建议查看时间花费在哪里。在这里使用 HANA JDBC 驱动程序中的 JDBC 性能跟踪选项可能很有用。 您也可以快速检查一下在服务器上插入 2Mio 记录需要多长时间,而不是从客户端发送它们。

类似

insert into SYSTEM.Employee (id, name) 
(select TOP 2000000
        1 as id 
      , 'NAME' as name
 from objects a 
      cross join objects b 
      cross join objects c);

可以为您提供一种基线,说明这将在您的服务器上合理花费多长时间。


好的,所以我再次对此进行了调查,并尝试在本地网络(通过 WIFI 连接)中重现 HANA 实例的不良性能。

未更改的测试用例(默认为autocommit = true)平均在 18 秒内完成(111,111 条记录/秒),这与我的预期非常接近。

更改为 autocommit = false 后仅发生了一点变化,表明提交的等待时间并不是总运行时间的关键因素。

另一个快速更改是启用compression(如果我没记错的话,这适用于 SAP HANA 2 SP03 或 SP04)。为网络通信启用压缩将此测试的总运行时间减少到 14 秒 (22%)。

无需花费太多时间来尝试重现这种情况,我会说绝对值得看看网络性能是否没有导致您的情况出现问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2012-03-23
    • 1970-01-01
    • 2011-02-28
    相关资源
    最近更新 更多