【问题标题】:Oracle UPDATE statement performanceOracle UPDATE 语句性能
【发布时间】:2018-06-18 09:53:07
【问题描述】:

问题是,在有许多 (>1000) 个 ID 的情况下,两者中哪一个性能更高,为什么?

1) 这个对每个id一个一个执行,只在最后一个之后提交:

UPDATE User u SET u.status='ACTIVE' WHERE u.id=1;

2) 或者:

UPDATE User u SET u.status='ACTIVE' WHERE u.id IN (1,2,3....)

【问题讨论】:

  • 单次更新会比逐行更高效,但in()只能取1000个值。要更新的 ID 从哪里来?如果您要根据数据库中的其他数据来决定更新哪个,那么直接相关的更新会更好。
  • 更有效的方法是,将这些 id 转储到临时表中,然后使用存在更新。
  • 它将由 Java 程序通过 Hibernate 执行,因此我必须确保它不会生成第一个变体,而是生成第二个变体以提高性能。 (很可能是 CriteriaUpdate)
  • @clementino 。 . .副手,我想不出我会期望第一种方法具有更好性能的场景。一般来说,最好在数据库中做数据库操作。

标签: sql oracle performance


【解决方案1】:

答案是第二种情况应该优于第一种。多少取决于您如何运行这些更新语句。如果您打算从客户端运行它们,例如一个 Java 程序,那么您的第一种方法会产生很大的延迟损失,因为您会为每次更新都打开新的数据库连接。如果只是直接在 Oracle 上运行单独的更新,如果第二种情况下的 id 列表相当小,您可能不会看到性能上有太大差异。

【讨论】:

  • 感谢您的回答!它将由 Java 程序通过 Hibernate 执行,因此我必须制定更新查询以在第二个变体中结束。
  • @clementino 是的,当然,你应该这样做。 除非您的业务逻辑是这些记录将单独更新,一次一个,在这种情况下您别无选择。
【解决方案2】:

这两个语句之间没有区别,优化器会将每个 ID 的 IN 转换为 =。 但是您始终可以通过执行计划来检查它。 Generating and Displaying Execution Plans

【讨论】:

  • 优化器不会将带有in() 的单个更新转换为多个单独的更新。也许您对看到in() 转换为多个or 条件感到困惑?不过,这仍然是一个单一的声明......
  • 你是对的。我应该扩大我的答案。 WHERE u.id IN (1,2,3)WHERE u.id=1 or u.id=2 or u.id=3是一样的,这种说法我说的是=
  • 但这不是 OP 的第一个版本正在做的事情;有 1000 多个单独的更新语句。所以它们根本不一样,而且这种转换与这个问题并不真正相关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 2021-03-27
相关资源
最近更新 更多