【问题标题】:How effective is executeBatch on a Prepared Statement?executeBatch 对 Prepared Statement 的效果如何?
【发布时间】:2010-11-11 16:46:18
【问题描述】:

受制于这个问题,问一切:executeBatch方法的效果如何?是否有一个性能基准,上面写着..“如果要插入 1000 条记录,使用 executeBatch 而不是 executeUpdate 可以节省 x 数量的数据库周期?”

或者这只是一个约定?

编辑: 以下是我正在使用的:一个托管在 Z/OS 上的 DB2 V 8.1,一个 Web 应用程序,在最坏的情况下执行时将一次性插入 80,000 条记录。

【问题讨论】:

  • 与其让每个人都给你毛骨悚然的数字,何不自己尝试并测量一下呢?只有您自己才能知道您将从您的设置中获得多少好处。
  • @skaffman 我不想做通常所说的过早优化。但是,我想了解它的速度有多快。
  • 我明白这一点,但如果没有一些基准测试,您将无法做出明智的选择。
  • 考虑使用 rewriteBatchedStatements=true stackoverflow.com/questions/26307760/…

标签: java database performance jdbc jakarta-ee


【解决方案1】:

不确定您使用的是什么数据库。当我使用 db2 对此进行测试时,我看到的是:

写入数据库:

1 次插入需要 2500 微秒。

10 次插入需要 6000 微秒。 (每次写入 600 微秒)

10000 次插入大约需要 100 万微秒。 (每次写入 100 微秒)

那里的性能最大化。 这意味着发送消息的开销很大,而使用批处理方法可以最大限度地减少这种开销。当然,如果应用程序崩溃,大批量发送插入/更新可能会丢失它们。

另请注意:具体数字会因您的数据库和设置而异。所以你必须找到自己的“甜蜜点”。但这给了你一个想法。

【讨论】:

  • @windfinder 您是否对上述所有内容都使用了 executeBatch?而且,您说“大批量有在应用程序崩溃中丢失的风险”——如果我使用事务管理——我应该在这种情况下做得很好吗?
  • 是的,我使用了 executeBatch。事务管理不会完全消除这种风险,但可能会降低它。
  • 以最简单的方式,如果我将 autocommit 设置为 false 并仅在 executeBatch 返回时提交,我会有什么风险?
  • @windfinder - 您是如何找到和衡量这些时间的?
  • 如果我们使用可调用语句但过程只有插入语句,我们能否获得相同的性能提升?
【解决方案2】:

我不确定您在问什么,但对于插入数千行,批处理语句大大 更快。不过,我不能给你数字。

【讨论】:

  • @skaffman 这是我的问题——它的速度有多快?你能给我一个近似值吗?
  • 我估计在 10 到 20 次之间,这在很大程度上取决于数据库本身。非批处理语句涉及更多的网络流量,因此移除服务器比本地服务器更受益于批处理。
  • 在我的经验中超过 10-20 倍(对于我的特定用例)。
【解决方案3】:

根据我的经验,它的速度要快得多 - 即使您一次只插入/更新几条记录。如果您要进行多次更新,我几乎总是建议在有意义的情况下对它们进行批处理。

也就是说,您必须进行一些实际测试才能确定针对您的特定情况的性能改进。

【讨论】:

    【解决方案4】:

    JDBC 规范第 14 章说提交多个 SQL 语句,而不是 单独,可以大大提高性能

    【讨论】:

      【解决方案5】:

      在 batchExecute() 中,更新语句比插入语句花费更多时间,我正在使用 5001 个插入和更新语句 性能比是 15:84

      【讨论】:

      • 答案在哪里?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 2014-02-24
      • 1970-01-01
      • 2014-11-04
      • 2012-08-19
      • 2011-01-07
      • 1970-01-01
      相关资源
      最近更新 更多