暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 批量收集使用

askTom 2017-03-24
514

问题描述

嗨,

您能否让我知道如何判断在使用批量收集来获取游标时应该是我们的限制。我在各种博客中读到,使用批量收集并不总是一个好的选择,因为它在少数情况下会降低性能。

请让我知道同样的细节。


提前谢谢...

问候
十八集

专家解答

没有硬性规定。

* 通常 * 批量收集将比逐行获取更快,但是随着限制的增加,收益水平会降低。例如

SQL> create table t
  2  as select d.* from dba_objects d,
  3    ( select 1 from dual connect by level <= 10 );

Table created.

SQL> declare
  2    type tlist is table of t%rowtype
  3      index by pls_integer;
  4    r tlist;
  5    s timestamp;
  6    limit_size int := 5;
  7    cursor c is select * from t;
  8  begin
  9    for i in 1 .. 8 loop
 10      s := localtimestamp;
 11      open c;
 12      loop
 13        fetch c bulk collect into r limit limit_size;
 14        exit when c%notfound;
 15      end loop;
 16      close c;
 17      dbms_output.put_line('Limit='||limit_size||',time='||(localtimestamp-s));
 18      limit_size :=limit_size * 2;
 19    end loop;
 20  end;
 21  /
Limit=5,time=+000000000 00:00:02.866000000
Limit=10,time=+000000000 00:00:02.239000000
Limit=20,time=+000000000 00:00:02.007000000
Limit=40,time=+000000000 00:00:01.855000000
Limit=80,time=+000000000 00:00:01.734000000
Limit=160,time=+000000000 00:00:01.747000000
Limit=320,time=+000000000 00:00:01.758000000
Limit=640,time=+000000000 00:00:01.762000000

PL/SQL procedure successfully completed.


复制


所以在我的机器上,80岁以上的我看不到什么好处。有些边界情况可能会起作用。例如,我可能会很幸运,在一个表的 “顶部” 找到10行,而第11行在全表扫描中更远... 所以在这种特殊情况下,10的限制会比20的限制更快,对于第一遍 .... 但是它们通常不值得考虑处理自定义代码。

我的一般做法是:

-如果我 * 知道 * 它的一行 (例如主键查找),则使用select-输入
-如果我 * 知道 * 它是一个小的有限列表 (例如 “国家列表”),我将选择-批量收集
-否则我会用100的取值。


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论