使用批量收集时为 LIMIT 设置一个值

Setting a value for LIMIT while using bulk collect

我想知道我们是否有任何技术可以计算需要为批量收集操作的 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;

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

我见过很多人浪费很多时间担心这个。如果您思考 为什么 批量收集可以提高性能,您就会明白为什么大数字无济于事。

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

这种 1/N 调和级数性能行为可以在其他 Oracle 功能中找到,例如序列缓存和应用程序行提取。

使用默认值。把时间花在担心更重要的事情上。