• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > Oracle的pipelined函数实现高性能大数据处理

Oracle的pipelined函数实现高性能大数据处理

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了Oracle,pipelined,函数,实现,高性能,数据处等相关知识,希望本文的分享对您有所帮助

在plsql开发中,会涉及到一些大数据量表的数据处理,如将某记录数超亿的表的记录经过处理转换插入到另外一张或几张表。 常规的操作方法固然可以实现,但时间、磁盘IO、redo日志等等都非常大。Oracle 提供了一种高级函数,可以将这种数据处理的性能提升到极限

在plsql开发中,会涉及到一些大数据量表的数据处理,如将某记录数超亿的表的记录经过处理转换插入到另外一张或几张表。

常规的操作方法固然可以实现,但时间、磁盘IO、redo日志等等都非常大。Oracle 提供了一种高级函数,可以将这种数据处理的性能提升到极限。这种函数称为管道函数。

在实际项目中,管道函数会和表函数、数据流函数(即表函数和CURSOR结合)、数据集合、并行度一起使用,达到大数据处理的性能顶峰。
-


下面是一个例子,将表t_ss_normal的记录插入到表t_target中,插入过程中有部分转换操作。

我分成四个方法来实现这个数据处理操作。

第一个方法,也是最常规的方法,代码如下:

1.create table T_SS_NORMAL
2.(
3. owner VARCHAR2(30),
4. object_name VARCHAR2(128),
5. subobject_name VARCHAR2(30),
6. object_id NUMBER,
7. data_object_id NUMBER,
8. object_type VARCHAR2(19),
9. created DATE, 10. last_ddl_time DATE, 11. timestamp VARCHAR2(19), 12. status VARCHAR2(7),
13. temporary VARCHAR2(1), 14. generated VARCHAR2(1),
15. secondary VARCHAR2(1)
16.);
17./
18.
19.create table T_TARGET 20.(
21. owner VARCHAR2(30),
22. object_name VARCHAR2(128),
23. comm VARCHAR2(10)
24.);
这是源表和目标表的表结构。现在源表有200W条,其数据来自dba_objects视图。

1.create or replace package pkg_test is
2. procedure load_target_normal; 3.end pkg_test; 4.
5.create or replace package body pkg_test is 6. procedure load_target_normal is 7. begin 8. insert into t_target (owner, object_name, comm) 9. select owner, object_name, 'xxx' from t_ss_normal; 10. commit; 11. end; 12.begin 13. null; 14.end pkg_test;
一个insert into select语句搞定这个数据处理,简单。
一个insert into select语句搞定这个数据处理,简单。

1.create type obj_target as object(
2.owner VARCHAR2(30), object_name VARCHAR2(128), comm varchar2(10)
3.);
4./
5.create or replace type typ_array_target as table of obj_target; 6./
7.
8.create or replace package pkg_test is 9.
10. function pipe_target(p_source_data in sys_refcursor) return typ_array_target 11. pipelined;
12.
13. procedure load_target; 14.end pkg_test; 首先创建两个自定义的类型。obj_target的定义和t_target的表结构一致,用于存储每一条目标表记录。typ_array_target用于管道函数的返回值。

接着定义一个管道函数。

普通函数的结尾加一个pipelined关键字,就是管道函数。这个函数的返回参数类型为集合,这是为了使其能作为表函数使用。表函数就是在from子句中以table(v_resultset)调用的,v_resultset就是一个集合类型的参数。

最后定义一个调用存储过程。

在包体中定义该管道函数和调用存储过程。管道函数pipe_target的传入参数一个sys_refcursor类型。这是一个游标,可以理解为使用select * from table才能得到的结果集。

你也可以不用这个传入的游标,取而代之,在函数中定义一个游标,也一样使用。

1. function pipe_target(p_source_data in sys_refcursor) return typ_array_target
2. pipelined is 3. r_target_data obj_target := obj_target(null, null, null); 4. r_source_data t_ss%rowtype;
5.
6. begin 7.
8. loop
9. fetch p_source_data 10. into r_source_data; 11. exit when p_source_data%notfound; 12.
13. r_target_data.owner := r_source_data.owner;
14. r_target_data.object_name := r_source_data.object_name;
15. r_target_data.comm := 'xxx'; 16. pipe row(r_target_data);
17.
18. end loop; 19.
20. close p_source_data; 21. return; 22.
23. end; 24.
25. procedure load_target is 26. begin 27. insert into t_target 28. (owner, object_name, comm)
29. select owner, object_name, comm 30. from table(pipe_target(cursor(select * from t_ss_normal))); 31. commit; 32. end; 33.
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 浅析drop user与delete from mysql.user的区别
  • mysql prompt的用法详解
  • 如何使用索引提高查询速度
  • 深入mysql创建自定义函数与存储过程的详解
  • JDBC数据库的使用操作总结
  • MySQL查询优化:LIMIT 1避免全表扫描提高查询效率
  • MySQL与Oracle的语法区别详细对比
  • 有关mysql中ROW_COUNT()的小例子
  • MySQL 百万级分页优化(Mysql千万级快速分页)
  • 从创建数据库到存储过程与用户自定义函数的小感

相关文章

  • 2017-05-11sql语句中like的用法详细解析
  • 2018-12-05MySQL数据库优化经验详谈(服务器普通配置)第1/3页
  • 2017-05-11基于mysql事务、视图、存储过程、触发器的应用分析
  • 2018-12-05MySQL的嵌套事务实现
  • 2017-05-11MySQL中的SUM函数使用教程
  • 2017-05-11清空mysql 查询缓存的可行方法
  • 2017-05-11DBA应该知道的一些关于SQL Server跟踪标记的使用
  • 2018-12-05有木有哪位前辈用mysql直接连接android的
  • 2017-05-11MySQL 4.0 升级到mysql 5.0的方法
  • 2018-12-05SQL Server连接失败错误及解决第1/5页

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • mysql的udf编程之非阻塞超时重传
    • 关于MySQL数据类型的一些介绍
    • 关于mysqlslap对mysql进行压力测试的详细介绍
    • Oracle 11g 操作ASM权限问题
    • MySQL 在触发器里中断记录的插入或更新?
    • sql 时间函数 整理的比较全了
    • SQL Server 数据页缓冲区的内存瓶颈分析
    • 对SQL查询方法精彩汇总
    • MYSQL自检时提示:[Microsoft][ODBC 驱动程序管理器] 未发现数据
    • 关于mysql 查看当前使用的配置文件my.cnf的方法讲解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有