FORALL与FOR批量更新

时间:2015-07-01 19:09:25

标签: sql oracle performance plsql

这是在接受采访时提出的。问题是,哪一个更快,FORALL在5000或在500记录上使用FOR? 好吧,我认为就处理速度而言,FORALL确实更快但仍依赖于要处理的行数,就像上面的问题一样。 请分享您的想法。

1 个答案:

答案 0 :(得分:8)

取决于。

首先,如何设置测试?在普通代码中,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循环来迭代已填充的集合以进行比较以获得公平的集合。您使用哪种方法可能会对结果产生巨大影响。

for消除了SQL和PL / SQL引擎之间的上下文转换,就是这样。如果程序运行时的很大一部分用于上下文转换,那么这将非常有用。你使用数据做的事情越贵(如果包括那个时间,那么获取数据的成本就越高),上下文轮换所花费的时间就越少。如果你排除了获取数据所需的时间,并且循环的内容是一个简单的操作,那么forall循环解决方案可能会花费超过90%的时间来进行上下文切换,因此{{1解决方案可能快10倍。如果你包括获取数据所需的时间,那么这个时间只占整个运行时的很大一部分,而你的循环内核是一个昂贵的操作,for循环解决方案可能只花费了一小部分时间。它是时候进行上下文调整,所以进入forall不会让你几乎提高10倍。

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