bulkwhat使用batchExecute()JDBC可以做更多的工作来提高SAP HANA DB上大容量插入的性能



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

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();
}

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

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

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

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

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

con.setAutoCommit(false);

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

如果之后表现仍然不好,我建议你看看时间花在哪里了。在这里,使用HANA JDBC驱动程序中的JDBC性能跟踪选项可能很有用。您还可以进行快速检查,看看在不从客户端发送2Mio记录的情况下,在服务器上插入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秒内完成(111111条记录/秒(,这与我的预期非常接近。

随着autocommit = false的更改,这只发生了一点变化,表明提交的等待时间并不是整个运行时间的关键因素。

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

在不花太多时间试图重现这种情况的情况下,我想说,看看网络性能是否不是导致您的问题的原因,这绝对是值得的。

最新更新