这是在接受采访时提出的。问题是,哪一个更快,FORALL在5000或在500记录上使用FOR? 好吧,我认为就处理速度而言,FORALL确实更快但仍依赖于要处理的行数,就像上面的问题一样。 请分享您的想法。
答案 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
中更详细讨论的内容。