Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 使用批量收集的显式游标与隐式游标:有性能问题吗?_Oracle_For Loop_Cursor - Fatal编程技术网

Oracle 使用批量收集的显式游标与隐式游标:有性能问题吗?

Oracle 使用批量收集的显式游标与隐式游标:有性能问题吗?,oracle,for-loop,cursor,Oracle,For Loop,Cursor,在Oracle杂志(现在在线)上的一篇旧文章中,Steven Feuerstein展示了使用批量收集(在线文章中的清单4)对显式循环游标的优化: 我知道bulkcollect提高了性能,因为SQL和PL/SQL之间的上下文切换较少 我的问题是关于循环的隐式光标: BEGIN FOR S in (SELECT * FROM employees) LOOP -- process current record of S END LOOP; END; 每个记录的每个循环中是否有上下

在Oracle杂志(现在在线)上的一篇旧文章中,Steven Feuerstein展示了使用
批量收集
(在线文章中的清单4)对显式
循环游标
的优化:

我知道
bulkcollect
提高了性能,因为SQL和PL/SQL之间的上下文切换较少

我的问题是关于循环的隐式
光标

BEGIN
  FOR S in (SELECT * FROM employees)
  LOOP
    -- process current record of S
  END LOOP;
END;
每个记录的每个循环中是否有上下文切换?问题是否与显式游标相同,或者是否在“幕后”进行了优化?使用显式游标和批量收集重写代码会更好吗?

是的,即使您的
--进程当前记录的S
包含纯SQL和无PL/SQL,您也可以使用上下文开关作为。。。循环是PL/SQL,但查询是SQL

只要有可能,您应该更喜欢使用单个SQL语句来处理数据(还应考虑,不仅仅是DELETE、UPDATE、INSERT),在大多数情况下,它们比逐行处理要快

注意,如果通过
l_employees
进行循环并对每条记录执行DLL,则不会获得任何性能


限制100
是相当无用的。一次只处理100行与逐个处理行几乎相同-Oracle不在具有64K内存的Z80上运行。

从Oracle 10g开始,优化PL/SQL编译器可以自动将FOR循环转换为默认数组大小为100的批量收集循环

因此,通常不需要将隐式FOR循环转换为批量收集循环

但有时您可能希望使用批量收集。例如,如果每次提取100行的默认数组大小不满足您的要求,或者您希望更新集合中的数据


汤姆·凯特也回答了同样的问题。您可以在此处查看:

这取决于“process l_employees”中发生的情况。@WilliamRobertson问题更多的是隐式游标和显式游标之间的区别。提供了一个完美的答案:隐式游标是内部优化的,因此无需将隐式游标转换为手动优化的显式游标。感谢您提供有关性能的一般提示。但是,提供了我的问题的匹配答案:隐式游标是内部优化的,因此无需将隐式游标转换为手动优化的显式游标
BEGIN
  FOR S in (SELECT * FROM employees)
  LOOP
    -- process current record of S
  END LOOP;
END;