JDBC 批量执行保证

JDBC batch execution guarantees

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

我们使用标准 JDBC 批量插入模式 addBatch() & executeBatch()PreparedStatements ().

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

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

奇怪的是,当基础数据源是 SQL 服务器时,批处理按预期扩展。

问题是: standard/spec 中没有任何内容表明 executeBatch() 应该比线性缩放更好吗?

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

CHAPTER 14 Batch Updates

The batch update facility allows multiple SQL statements to be submitted to a data source for processing at once. Submitting multiple SQL statements, instead of individually, can greatly improve performance. Statement, PreparedStatement, and CallableStatement objects can be used to submit batch updates

14.1.4 PreparedStatement Objects 没有这样的 explicit/implied 声明说批处理机制是为了更好的性能。


可能应该补充一点,Azure Synapse 能够在 17-26 分钟内使用 500 个 DWU 从数据湖加载 1 万亿行数据(Parquet 格式约 450 GB)。

JDBC 规范不需要对批处理执行进行任何类型的优化。事实上,并不是所有的数据库都支持批量执行。符合规范的 JDBC 驱动程序有望实现批处理,无论底层数据库系统是否支持它。

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

这也是为什么你引用的文字说 " 可以 大大提高性能" 而不是 必须.