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 比较的更多相关文章
随机推荐
- Dapper.Net 应用
Dapper应用 1.Dapper是什么 Dapper是一款轻量级ORM工具.如果你在小的项目中,使用Entity Framework.NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用 ...
- [Fluent NHibernate]一对多关系处理
目录 写在前面 系列文章 一对多关系 总结 写在前面 上篇文章简单介绍了,Fluent Nhibernate使用代码的方式生成Nhibernate的配置文件,以及如何生成持久化类的映射文件.通过上篇的 ...
- 移动端框架篇-控制父容器的滑屏框架-slip.js
设计滑屏框架的办法一般有2种 控制父容器法 控制子容器法 这个算是控制父容器法 通过控制父容器的transform: translateY或margin-top或top的值来上下滑动页面,每次的位移的 ...
- Floyed判环/龟兔算法
求[(5+2√6)2^x+1 ] mod p 的值,其中 0 ≤ x < 232 , p 是个质数,p ≤ 46337 .(这里介绍的是一种暴力的做法) (5+2√6)2^n+1 = an + ...
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
1.前言 使用框架都是较新的版本: Spring 4.0.2 RELEASE Spring MVC 4.0.2 RELEASE MyBatis 3.2.6 2.Maven引入需要的JAR包 2.1设置 ...
- PHP用curl伪造IP和来源
以前没有这么搞过. 今天群里一个朋友在问这个问题. 查了下,CURL确实很强悍的可以伪造IP和来源. 1.php 请求 2.php . 1.php代码: $ch = curl_init(); curl ...
- php.ini 安全配置
(1) 打开php的安全模式 php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/ ...
- word20161211
H.323 half-duplex / 半双工 handle count / 句柄数 handshaking / 握手 Hardware Compatibility List, HCL / 硬件兼容性 ...
- python基础五
列表生成式 将列表data=[1,2,3]里的元素都乘2 方法一 data=[1,2,3] for index,i in enumerate(data): data[index] *=2 print( ...
- 音频指纹(Philips)
参考<A Highly Robust Audio Fingerprinting System> Philips 音频指纹提取流程: 仿真效果: 第一个图为歌曲1的第一个指纹. 第二个图为歌 ...