Dpa*_*shu 1 sql oracle performance plsql
这在面试中被问到.问题是,哪一个更快,FORALL在5000或在500记录上使用FOR?好吧,我认为就处理速度而言,FORALL确实更快但仍依赖于要处理的行数,就像上面的问题一样.请分享你的想法.
Jus*_*ave 10
这取决于.
首先,测试是如何设置的?在普通代码中,for循环运行查询并执行某些操作,如果您正在测量循环的性能,则需要将运行查询所需的时间,获取结果以及对结果执行某些操作进行组合.
for x in (<<some select statement>>)
loop
<<do something with x>>
end loop;
Run Code Online (Sandbox Code Playgroud)
一个forall在另一方面,意味着你已经完成了获取你需要处理到本地收集数据的工作.
forall i in 1..l_collection.count
<<do something>>
Run Code Online (Sandbox Code Playgroud)
性能比较包括运行查询和在一个案例中获取结果所需的时间,并将该时间排除在另一个案例之外,这不是一个公平的比较.您需要在forall案例中for包含填充集合的成本,或者您需要循环迭代已填充的集合以进行比较才能成为公平的集合.您使用哪种方法可能会对结果产生巨大影响.
A forall消除了SQL和PL/SQL引擎之间的上下文转换,就是这样.如果程序运行时的很大一部分用于上下文转换,那么这将非常有用.你使用数据做的事情越贵(如果包括那个时间,那么获取数据的成本就越高),上下文轮换所花费的时间就越少.如果你排除了获取数据所需的时间,并且你的循环内容是一项微不足道的操作,那么for循环解决方案可能会花费90%以上的时间进行上下文转换,因此forall解决方案的速度可能要快10倍.如果你包括获取数据所需的时间,那么这个时间只占整个运行时的很大一部分,而你的循环内核是一个昂贵的操作,for循环解决方案可能花费一小部分时间进行上下文转换所以去一个forall不会让你几乎提高10倍.
如果要包括填充集合所需的时间,事情会变得更加复杂,因为根据您使用隐式或显式游标以及Oracle版本,有许多方法可能会编写具有不同性能特征的方法.这个问题bulk collect在这个关于a的表现的问题中有更详细的讨论.