使用批量收集时设置LIMIT的值

XIN*_*ING 2 oracle plsql plsqldeveloper oracle11gr2

我想知道我们是否有任何技术可以计算出需要为批量收集操作的LIMIT子句设置的值.例如下面,假设我们的光标有1000万条记录.我们可以为LIMIT子句设置的值是什么,以获得最佳性能.我们有什么方法可以计算它.

decalre
cursor c_emp is <some select query>

var  <variable> ;

begin
     open c_emp;
       loop
           fetch c_emp bulk collect into var limit 2;
           exit when c_emp%NOTFOUND;
      end loop;
     close c_emp;
  end;
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 6

在游标FOR LOOP中使用隐式游标.它使代码更简单,默认值100几乎总是足够好.

我见过很多人浪费了很多时间来担心这件事.如果您考虑为什么批量收集可以提高性能,您将理解为什么大数据无济于事.

批量收集通过减少SQL和PL/SQL之间的上下文切换来提高性能.想象一下极不可能的最坏情况,其中上下文切换耗尽了所有运行时间.限制为2可消除50%的上​​下文切换; 10消除了90%; 100消除了99%等.将其绘制出来你会发现它不值得找到最佳极限尺寸:

在此输入图像描述

使用默认值.花时间担心更重要的事情.

  • 公平地说,OP可能希望使用批量收集来执行带有`forall`或类似内容的数组DML,而游标FOR循环将无济于事。但是对收益递减的很好解释。 (2认同)