如何在JDBC中选择最佳的批处理大小?

7

我有一个包含50000条记录的CSV文件,我想使用JDBC中的批处理将其导入SQL。

对于此操作,应该选择什么样的最佳批处理大小?

2个回答

7

根据Oracle官方建议,最佳批量大小在50到100之间。

证明: https://docs.oracle.com/cd/E11882_01/java.112/e16548/oraperf.htm#JJDBC28754

Oracle建议尽可能使用JDBC标准功能,这个建议同样适用于更新批处理。 Oracle更新批处理主要保留用于向后兼容性。

对于标准的更新批处理和Oracle更新批处理,Oracle建议您将批处理大小保持在50到100的一般范围内。这是因为尽管驱动程序支持更大的批次,但它们反过来会导致大量的内存占用,而没有相应的性能提升。非常大的批次通常会导致与较小的批次相比性能下降。

祝你有愉快的一天。


1
Oracle风格的批处理在几个版本之前已经停止支持。我不记得是在哪个版本中停止支持的。 - Douglas Surber

1

50000条记录并不算大型数据集。增加批处理大小可以提高效率,但如果假设数据库服务器网络往返时间为10毫秒:

  1. 批处理大小为50 => 50000行/50批处理大小*10毫秒延迟=10000毫秒延迟开销=10秒延迟开销

  2. 批处理大小为100 => 50000行/100批处理大小*10毫秒延迟=5000毫秒延迟开销=5秒延迟开销

首先设置一个合理的批处理大小用于批量插入语句,然后测量实际插入行所需的时间。记得在批量插入后进行vacuum操作。

如果50,000条记录需要1分钟插入,则需要专注于优化插入过程而非JDBC批处理大小,因为总时间只有一小部分用于延迟开销。

对于更大的数据集,您不应该使用JDBC。有专门设计用于批量插入任务的工具,例如Oracle的SQL*Loader


1
如果整个数据集都使用相同的SQL插入,并且绑定到每个参数的值始终相同,这也很重要。如果有时将DATE绑定到参数1,而其他时间将TIMESTAMP绑定到参数1,这将使事情变慢。绑定到给定参数的每个值应始终是相同的类型。如果不是,驱动程序将工作,但速度会慢得多。同样,如果批处理包含多个SQL,则每个批处理都应仅使用一个SQL、一个PreparedStatement创建。如果不这样做,它也可以工作,但速度会慢得多。 - Douglas Surber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接