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 比较的更多相关文章
随机推荐
- 逆向工程学习第三天--另外一个ShellCode
上周自己打造的添加用户的shellcode太长,不过当时主要目的是为了锻炼手动asm,熟悉一些复杂的参数类型如何手动进行构造,然后通过堆栈传递. 接下来就打造一个弹计算器的shellcode来进行接下 ...
- GPS模块数据放入谷歌地图显示,不准
GPS 串口读出的是 DDMM.MMMM格式 一般上位机是 DD.DDDDDD°或 DD°MM'SS" 格式, 这两种都可以在 GE 里直接输入 举例说明: 3147.8749 (示例,经纬 ...
- windows系统在python3.5环境下安装mysql组件
折腾了一个多小时,终于把连接Mysql的模块装好了,由于我的环境是python3.5,Mysql官方支持到python3.4,后面google查到有pymysql模快支持python3.5,这个模块是 ...
- ecshop 多表删除
$sql = 'DELETE O, G FROM ' . $GLOBALS['ecs']->table('delivery_order') . ' AS O, ' . $GLOBALS['ecs ...
- Solr学习总结(一)Solr介绍
最近一直在搞Solr的问题,研究Solr 的优化,搜索引擎的bug修改等,这几天终于有时间,闲下来总结分享,以便大家参考,与大家一起来共同学习. Solr是一个基于Lucene的全文搜索引擎,同 ...
- centos7安装nexus私服2.14
今天项目经理叫搭个nexus私服,记录一下 nexus下载比较慢,可在本地下载,然后用sftp上传到linux系统去,下载地址https://www.sonatype.com/download-oss ...
- [Head First设计模式]抢票中的设计模式——代理模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- C#高级编程笔记 Day 8, 2016年9月 28日 (数组)
1.数组的初始化 声明了数组后,就必须为数组分配内存,以保存数组的所有元素.数组是引用类型,所以必须给它分配堆上的内存,为此,应使用 new 运算符,指定数组中元素的类型和数量来初始化数组的变量.若使 ...
- JS事件对象与事件委托
事件对象 包含事件相关的信息,如鼠标.时间.触发的DOM对象等 js默认将事件对象封装好,并自动的以参数的形式,传递给事件处理函数的第1个参数,如下: document.getElementsByTa ...
- mysql ERROR 1045 (28000): 错误解决办法
ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO) ERROR 1045 (28000 ...