【问题标题】:FORALL vs FOR bulk updateFORALL 与 FOR 批量更新
【发布时间】:2015-09-19 02:30:37
【问题描述】:

这是在采访中被问到的。问题是,哪一个更快,5000 条记录上的 FORALL 还是 500 条记录上的 FORALL? 好吧,我认为就处理速度而言,FORALL 确实更快,但它仍然取决于要处理的行数,就像上面的问题一样。 请分享您的想法。

【问题讨论】:

  • 您能否标记语言/数据库/这个问题涉及的任何内容?如果这是一个 Oracle PL/SQL 问题,答案在tuning guide 中有相当详细的介绍。
  • 它适用于 Oracle PL/Sql..
  • 细节很好,但你会特别回答这个问题。是 FORALL 5000 还是 FOR 500 ..?
  • 由于这是一个面试问题,我很确定您不会给出确切的数字(可能会因其他参数而有很大差异),而是提出技术原因来展示你对概念的理解。
  • 我同意@dhke。唯一有效的答案是“视情况而定”。如果面试官很聪明,他们会希望你解释所有可能影响这两种方法表现的因素。当然,他们可能并不聪明,想要一个明确的答案。在这种情况下,你为什么要在那里工作?

标签: sql oracle performance plsql


【解决方案1】:

视情况而定。

首先,测试是如何设置的?在普通代码中,for 循环运行查询并执行某些操作,因此如果您正在测量循环的性能,您将结合运行查询、获取结果以及对结果执行操作所需的时间。

for x in (<<some select statement>>)
loop
  <<do something with x>>
end loop;

另一方面,forall 表示您已经完成了将需要处理的数据提取到本地集合中的工作。

forall i in 1..l_collection.count
  <<do something>>

在一种情况下包括运行查询和获取结果所需的时间并从另一种情况中排除该时间的性能比较是不公平的比较。您要么需要在 forall 案例中包含填充集合的成本,要么需要 for 循环遍历已填充的集合,以便比较公平。您使用哪种方法可能会对结果产生巨大影响。

forall 消除了 SQL 和 PL/SQL 引擎之间的上下文转换,就是这样。如果程序运行时的很大一部分用于上下文转换,这将非常有用。您对数据所做的事情越昂贵(如果您将时间包括在内,获取数据的成本就越高),花费在上下文转换上的时间比例必须越小。如果您排除了获取数据所需的时间并且循环的内容是一项微不足道的操作,那么for 循环解决方案可能会花费超过 90% 的时间进行上下文转换,因此forall 解决方案可能快 10 倍。如果您包括获取数据所需的时间,那么该时间占整个运行时间的很大一部分,并且循环的核心是一项昂贵的操作,for 循环解决方案可能只花费一小部分时间进行上下文转换,因此转到forall 不会让您获得近 10 倍的改进。

如果您将填充集合所需的时间包括在内,事情会变得更加复杂,因为根据您使用的是隐式游标还是显式游标以及 Oracle 版本,有多种方法可能具有不同的性能特征。这在this question on the performance of a bulk collect 中有更详细的讨论。

【讨论】:

  • 恭喜,你得到了这份工作!
  • 感谢您提供如此清晰的解释.. @David Cave :)
猜你喜欢
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 2019-01-29
相关资源
最近更新 更多