oracle 管道表(pipelined table)函数与普通表函数简单对比

看资料说管道表函数在返回结果时不是一次性返回全部结果,因此对于某些对响应比较看重的报表程序而言比较友好。而普通表函数要在所有结果都到齐后才一次性返回结果。下面就做一个实验来验证:

首先创建一个自定义的集合类型

create type test_obj as  object(id number,name varchar2(10));

用自定义的集合类型创建一个table类型

create type test_obj_table as table of test_obj;

创建两个函数,一个管道表函数 f_withpipe(),一个普通表函数f_withoutpipe();

create or replace function f_withpipe(n number)
return test_obj_table pipelined --这里用pipelined结尾,return自定义table类型
is
v_test_obj test_obj:=test_obj(null,null);  --用自定义的集合类型声明一个变量,同时初始化变量
begin
  for i in 1..5000000 loop
    if mod(i,1000)=0 then
      v_test_obj.id:=i;  --给变量的属性赋值
      v_test_obj.name:='aaa';
      pipe row(v_test_obj); --返回这个集合的一个元素,相当于返回表的一行数据
    end if;
  end loop;
  return;  --用一个空return表示结束
end ;

create or replace function f_withoutpipe(n number)
return test_obj_table is  --返回自定义的table类型
v_obj_test test_obj_table:=test_obj_table();  --用table类型声明一个变量,并初始化
begin
  for i in 1..5000000 loop
    if mod(i,1000)=0 then
      v_obj_test.extend(1);   --每次extend一行
      v_obj_test(v_obj_test.last):=test_obj(i,'aaa'); --赋值,注意格式。用自定义的集合类型赋值
    end if;
  end loop;
  return v_obj_test;  --return这个变量
end ;

用plsql dev执行下边两个sql

select  * from table(f_withpipe());

第一屏结果在0.127s返回


select  id,name from table(f_withnopipe());

第一屏结果在3.363s返回

通过两次执行可以证明管道表函数是迭代式返回结果集,这样做的好处明显可以降低内存压力。

可以说明在某些处理结果集比较大的情形下管道表函数从请求的响应速度、降低服务器内存压力方面有比较明显的优势。

这个实验没能证明管道表函数效率要比普通表函数更高!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值