上一篇讲到了调用集锦,这篇关注一下性能问题吧。

DECLARE
CURSOR c_tool_list
IS
SELECT descr d1 FROM hardware;
l_descr hardware.descr%type;
BEGIN
OPEN c_tool_list;
LOOP
FETCH c_tool_list INTO l_descr;
EXIT
WHEN c_tool_list%notfound;
END LOOP;
CLOSE c_tool_list;
END;

上面的语句在小陈机子上运行时间:

Elapsed: 00:00:09.714

下面的语句又需要多久呢?

DECLARE
CURSOR c_tool_list
IS
SELECT descr d2 FROM hardware;
type t_descr_list
IS
TABLE OF c_tool_list%rowtype;
l_descr_list t_descr_list;
BEGIN
OPEN c_tool_list;
FETCH c_tool_list bulk collect INTO l_descr_list;
CLOSE c_tool_list;
END;

Elapsed: 00:00:00.667答案是:

两个语句比较,上面的自然是简洁上占了优势,也少写了代码。不过从性能上,完全后者逆袭呀。真是海水不可斗量,人不可貌相。

下面我们来看看 collection type 的性能比拼

SET timing ON
DECLARE
type t_va IS varray(1000) OF NUMBER;
type t_nt
IS
TABLE OF NUMBER;
type t_aa
IS
TABLE OF NUMBER INDEX BY pls_integer;
va t_va;
nt t_nt;
aa t_aa;
BEGIN
FOR i IN 1 .. 10000
LOOP
SELECT rownum
--
-- Comment in the collection type you want to test
--
bulk collect INTO va
--bulk collect into nt
--bulk collect into aa
FROM dual
CONNECT BY level <= 1000 ;
END LOOP;
END;

varray(1000) OF NUMBER;

TABLE OF NUMBER;

TABLE OF NUMBER INDEX BY pls_integer;

执行时间分别是:

Elapsed: 00:00:09.234

Elapsed: 00:00:09.272

Elapsed: 00:00:09.472

看来时间上相差不大。

然后介绍一下LIMIT用法,书中的内存一直在增加,而小流氓的一直没有增加,神马情况?

set serveroutput on;

cl scr;

DECLARE
type t_row_list
IS
TABLE OF hardware.descr%type;
l_rows t_row_list;
l_pga_ceiling NUMBER(10);
type t_fetch_size
IS
TABLE OF pls_integer;
l_fetch_sizes t_fetch_size := t_fetch_size(5,10,50,100,500,1000,10000,100000,1000000);
rc sys_refcursor;
BEGIN
SELECT value
INTO l_pga_ceiling
FROM v$mystat m,
v$statname s
WHERE s.statistic# = m.statistic#
AND s.name = 'session pga memory max';
dbms_output.put_line('Initial PGA: '||l_pga_ceiling);
FOR i IN 1 .. l_fetch_sizes.count
LOOP
OPEN rc FOR SELECT descr FROM hardware;
LOOP
FETCH rc bulk collect INTO l_rows limit l_fetch_sizes(i);
EXIT
WHEN rc%notfound;
END LOOP;
CLOSE rc;
SELECT value
INTO l_pga_ceiling
FROM v$mystat m,
v$statname s
WHERE s.statistic# = m.statistic#
AND s.name = 'session pga memory max';
dbms_output.put_line('Fetch size: '||l_fetch_sizes(i));
dbms_output.put_line('- PGA Max: '||l_pga_ceiling);
END LOOP;
END;

再来看看处理1000*1000*1000条数据,书中作者的报内存溢出了。ORA-04030: out of process memory when trying to allocate 16396 bytes

.

当然小陈的本本也不例外。只是错误不一样了。所以一定要配合LIMIT来使用,所以一定要配合LIMIT来使用,所以一定要配合LIMIT来使用。重要的事情说三次!!!

ORA-04036: 实例使用的 PGA 内存超出 PGA_AGGREGATE_LIMIT

cl scr;
DECLARE
type t_huge_set
IS
TABLE OF NUMBER;
l_the_server_slaminator t_huge_set;
BEGIN
SELECT rownum bulk collect
INTO l_the_server_slaminator
FROM
( SELECT level FROM dual CONNECT BY level <= 1000),
( SELECT level FROM dual CONNECT BY level <= 1000),
( SELECT level FROM dual CONNECT BY level <= 1000);
END;

Bulk_Collect_Performance 比较的更多相关文章

随机推荐

  1. Mac OSX定位命令路径的方法

    可以使用which命令来定位一个命令. http://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/

  2. AutofacContainer

    /// <summary> /// Autofac容器 /// </summary> public class AutofacContainer { public static ...

  3. Spring实战 (第3版)——AOP

    在软件开发中,分布于应用中多处的功能被称为横切关注点.通常,这些横切关注点从概念上是与应用的 业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑之中).将这些横切关注点与业务逻辑相分离正是 面向切面编 ...

  4. SQL SERVER几种数据迁移/导出导入的实践

    SQLServer提供了多种数据导出导入的工具和方法,在此,分享我实践的经验(只涉及数据库与Excel.数据库与文本文件.数据库与数据库之间的导出导入). (一)数据库与Excel 方法1: 使用数据 ...

  5. 马化腾称春节前推出微信小程序

    腾讯马化腾在第二届深商大会“互联与时代”论坛上透露,会在2017年春节前推出微信小程序.在谈到“互联网+”.开放生态等话题时,马化腾表示,腾讯从过去5年来,从封闭的环境变成一个开放的环境,变成一个真正 ...

  6. OS X EI Capitan安装refind时出现Could not set boot device property: 0xe00002bc

    参考:terminal - OSX 10.11 El Capitan - setting boot device property not working ... 解决办法: 1.重启MacMini, ...

  7. Android 光线传感器的调用

    1.activity如果要使用传感器,就必须实现SensorEventListener接口 2.得到传感器管理对象(sensormanager) 3.使用sensormanager.registerl ...

  8. Python: zip函数

    zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表. 参考链接解释

  9. 关于网络-get/post

    关于网络: //英译  connection:连接 append:添加 resign:放弃 // 加载网页数据 步骤 [self.webView loadRequest:request]; NSURL ...

  10. PHP文件上传相关

    1.必须通过POST提交 2. 声明 enctype="multipart/form-data"   $_FILES {[pic]=array ( [name]=>     ...