JDBC批处理执行保证

时间:2020-05-05 14:20:53

标签: performance jdbc azure-sql-data-warehouse

我们正在尝试对Azure Synapse(以前称为Azure SQL数据仓库)执行批处理插入。问题是:

  • 性能太差了(插入少于2KB的行和20-25列需要大约1秒的时间)
  • 它线性扩展(我认为100行约90秒)

我们正在将标准JDBC批处理插入模式addBatch()executeBatch()PreparedStatementshttps://stackoverflow.com/a/3786127/496289)配合使用。

我们正在使用Microsoft提供的JDBC驱动程序。

我们知道出了什么问题,在数据库遥测中,很明显,数据库正在分解批处理,或多或少地像在for循环中一样运行它。没有批处理“优化”。

奇怪的是,当基础数据源是SQL Server时,批处理按预期进行扩展。

问题是:在标准/规范中,没有任何内容executeBatch()比线性扩展更好吗?

例如JDBC™ 4.3 Specification (JSR 221)说它 可以 提高性能,而不是 必须

第14章批处理更新

批处理更新功能允许将多个SQL语句提交到一个数据源以立即进行处理。提交多个SQL语句(而不是单独提交)可以极大地提高性能。语句,PreparedStatement和CallableStatement对象可用于提交批处理更新

14.1.4 PreparedStatement Objects没有这样的显式/隐式声明,说批处理机制可以提高性能。


也许应该补充说,Azure Synapse能够使用500个DWU在17-26分钟内从Data lake加载1万亿行数据(Parquet格式约为450 GB)。

1 个答案:

答案 0 :(得分:1)

JDBC规范不需要任何类型的优化来执行批处理。实际上,并非所有数据库都支持批处理执行。无论基础数据库系统是否支持,符合标准的JDBC驱动程序都可以实现批处理执行。

如果数据库系统不支持它,则JDBC驱动程序将通过在循环中重复执行该语句来模拟批处理执行。这样的实现不会比手动重复执行语句更好。

这也是为什么您引用的文字显示 可以大大提高性能” ,而不是必须的原因>。