使用批量收集时为 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 功能中找到,例如序列缓存和应用程序行提取。
使用默认值。把时间花在担心更重要的事情上。
我想知道我们是否有任何技术可以计算需要为批量收集操作的 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 功能中找到,例如序列缓存和应用程序行提取。
使用默认值。把时间花在担心更重要的事情上。