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

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. Yii2.0 用户登录详解(上)

    一.准备 在开始编写代码之前,我们需要思考一下:用户登陆模块,实现的是什么功能?很明显,是登陆功能,那么,登陆需要用户名和密码,我们在数据库的一张表中就应该准备好用户名和密码的字段,再思考一下,如果要 ...

  2. diff 比较两个文件的差异

    功能:比较两个文件的差异,并把不同地方的信息显示出来.默认diff格式的信息. diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的补丁文件.也使用patch命令对 ...

  3. CSS3按钮效果

    来自codepen,http://codepen.io/PalashSharma20/pen/YWBAgN 知识点:屏幕居中.transform.transition.transition-delay ...

  4. QQ空间HD(6)-实现自定义的选项卡切换效果

    DJTabbarButton.m #import "DJTabbarButton.h" @implementation DJTabbarButton - (instancetype ...

  5. 如何在网页中添加“QQ交流”

    今天在撸码时,想到这个问题,有些网页中会有诸如,那么如何在网页添加"QQ交谈"? 第一步.登录QQ: 第二步.打开网页:QQ推广,启用QQ通讯组件: 第三步.选择组件样式,设置提示 ...

  6. 【Go入门教程6】interface(interface类型、interface值、空interface{}、嵌入interface、反射)

    interface Go语言里面设计最精妙的应该算interface,它让面向对象,内容组织实现非常的方便,当你看完这一章,你就会被interface的巧妙设计所折服. 什么是interface 简单 ...

  7. Java总结篇系列:Java多线程(一)

    多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程 ...

  8. inux中fork()函数详解(原创!!实例讲解)

    转载自原创博客,欢迎继续转载 点击跳转到原文

  9. eclipse for php现有项目不能导入问题

    1.少了.project文件 解决办法:创建一个新项目,然后将新项目文件夹下的.project文件复制到将要导入的文件夹中.

  10. Matlab学习笔记(一)—— 三维图形绘制

    这学期公选课选的是MATLAB,所以准备把这学期所学习的整理到博客上,作为记录,哇咔咔~ 一.三维函数图: x=cos(t), y=sin(t), z=t %≤t ≤*pi t=:*pi; %t的取值 ...