首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

Oracle的pipelined函数晋升数据输出性能

2012-09-25 
Oracle的pipelined函数提升数据输出性能?????? 从Oracle 8开始,我们就可以从一个collection类型的数据集合

Oracle的pipelined函数提升数据输出性能

?????? 从Oracle 8开始,我们就可以从一个collection类型的数据集合中查询出数据,这个集合称之为“虚拟表“。它的方法是“SELECT FROM TABLE(CAST(plsql_function AS collection_type))”,据说该方法在处理大数据量时会有内存方面的限制。到了Oracle 9i之后,一个称为pipelined表函数的技术被推出来。他和普通的表函数很类似,但还有有一些显著的差别。
第一,pipelined函数处理的数据,是以管道的方式,或者说是流的方式从预先准备的小数组中展现给用户,而普通表函数将数据全部准备好再展现给用户。
第二,pipelined函数可以并发,这意味着PLSQL可以同一时间在多个进程上执行。
第三,pipelined函数可以很容易将存储过程转换成用bulk操作的行,有利于实现的复杂转换逻辑的SQL。

?

(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1628397)

?

了解pipelined函数的最佳方法是看一个简单的例子。对于任何一个pipelined函数,都必须有两点要求。
1、一个定义在模式中或者包中collection类型;
2、一个单独的PL/SQL函数或一个包中的函数,函数的返回类型后面必须加pipelined关键字;


在下面的例子中,我们将创建一个简单的pipelined函数,输出若干行记录。首先需要一个collection类型,用于格式化输出。

SELECT get_time() AS ts FROM DUAL;SELECT column_value, get_time() AS ts FROM TABLE(pipelined_function);TS--------------------------------------------15:27:26.265 COLUMN_VALUE TS------------ --------------------------------------------      100000 15:27:26.312      200000 15:27:26.343      300000 15:27:26.390      400000 15:27:26.421      500000 15:27:26.453
?


?
结果显示,所有记录都是逐次输出。
这点对于用户的UI太重要了。试想,如果执行一个查询,过了10秒钟才显示出所有的结果好,还是还是每秒都显示一些记录,知道10秒钟显示完毕好?

如果这个输出的结果集再放到到百万记录,两个函数对PGA内存的消耗又完全不一样,这点更重要。

热点排行