Bulk_Collect_Performance 比较
上一篇讲到了调用集锦,这篇关注一下性能问题吧。
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;
l varray(1000) OF NUMBER;
l TABLE OF NUMBER;
l TABLE OF NUMBER INDEX BY pls_integer;
执行时间分别是:
l Elapsed: 00:00:09.234
l Elapsed: 00:00:09.272
l 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 比较的更多相关文章
随机推荐
- 【转】HTML5的小知识点小集合
html5的小知识点小集合 html5知识 1. Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于<h ...
- Web jquery表格组件 JQGrid 的使用 - 5.Pager翻页、搜索、格式化、自定义按钮
系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件 ...
- MyBatis学习总结(一)——MyBatis快速入门
一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...
- arguments 对象的老历史
引题:为什么 JavaScript 中的 arguments 对象不是数组 http://www.zhihu.com/question/50803453 JavaScript 1.0 1995 年, ...
- [Network] HTML、XML和JSON学习汇总
写在前面:楼主也是刚刚接触这方面的知识,之前完全是零基础,后来经朋友推荐了几个不错的博文,看完以后豁然开朗.但是此博文更加偏重于基础知识介绍(其实更深的楼主也还不了解,这方面的大神请绕道),只是分享个 ...
- I() 方法
I()方法的介绍及使用: http://www.jb51.net/article/51213.htm
- URL传递中文字符,特殊危险字符的解决方案(仅供参考)urldecode、base64_encode
很多时候,我们需要在url中传递中文字符或是其它的html等特殊字符,似乎总会有各种乱,不同的浏览器对他们的编码又不一样, 对于中文,一般的做法是: 把这些文本字符串传给url之前,先进行urlenc ...
- CentOS6.3编译安装Nginx1.4.7 + MySQL5.5.25a + PHP5.3.28
[准备工作] #在编译安装lnmp之前,首先先卸载已存在的rpm包. rpm -e httpd rpm -e mysql rpm -e php yum -y remove httpd yum -y r ...
- javascript基础06
javascript基础06 splice var del_arr = del.splice(0,2); //删除从指定位置deletePos开始的指定数量deleteCount的元素,数组形式返 ...
- core dump 是什么意思?
core dump,翻译过来讲,就是核心转储.大致上就是指,如果由于应用错误,如浮点异常.指令异常等,操作系统将会转入内核的异常处理,向对应的进程发送特定的信号(SIGNAL),如果进程中没有对这些信 ...