这是在面试中问到的。问题是,对于5000条记录和500条记录,哪个更快?我认为就处理速度而言,FORALL确实更快,但它仍然取决于要处理的行数,就像上面的问题一样。请分享你的想法。
发布于 2015-07-02 05:40:30
那得看情况。
首先,测试是如何设置的?在普通代码中,您的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中更详细讨论的内容。
https://stackoverflow.com/questions/31169692
复制相似问题