热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

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

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

在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.
推荐阅读
  • 应用程序配置详解
    本文介绍了配置文件的关键特性及其在不同场景下的应用,重点探讨了Machine.Config和Web.Config两种主要配置文件的用途和配置方法。文章还详细解释了如何利用XML格式的配置文件来调整应用程序的行为,包括自定义配置、错误处理、身份验证和授权设置。 ... [详细]
  • 本文详细探讨了在Windows Server 2003环境下遇到MySQL连接失败(错误代码10061)的解决方案,包括通过卸载特定的Windows更新和调整系统注册表设置的方法。 ... [详细]
  • 开发笔记:新手DVWACSRF
    开发笔记:新手DVWACSRF ... [详细]
  • 本文介绍了如何在PL/SQL中定义和使用包含多个字段的数组类型变量。首先通过一个简单的例子展示如何定义单字段数组,然后进一步扩展到多字段数组的应用。 ... [详细]
  • PHPFORMYSQL代码生成助手(根据Mysql里的字段自动生成类文件的)_PHP教程:根据Mysql里的字段自动生成类文件:但需要导入:require_once.dbez_sq ... [详细]
  • 本文探讨了为何DataWindow.NET在PowerBuilder 11之后版本中不再被支持,并提供了一种在PB12.5中恢复此功能的解决方案。欢迎交流与反馈。 ... [详细]
  • 本文提供了一组示例表,并探讨了如何通过SQL查询来计算父记录及其子记录的总金额。 ... [详细]
  • BME框架使用中的典型问题解析
    本文主要探讨了BME框架在实际应用中遇到的一些常见问题,包括查询条件为空、动态参数处理及分页查询等场景的解决方案。 ... [详细]
  • 本文探讨了Entity Framework 4(EF4)与SQL Server 2000之间的兼容性问题,并提供了官方反馈链接以供参考。 ... [详细]
  • databasesync适配openGauss使用指导书
    一、database-sync简介database-sync作为一种开源辅助工具,用于数据库之间的表同步,更确切的说法是复制,可以从一个数据库复制表到另一个数据库该工具支持的功能如 ... [详细]
  • 本文详细探讨了 Java 中 Daemon 线程的特点及其应用场景,并深入分析了 Random 类的源代码,帮助开发者更好地理解和使用这些核心组件。 ... [详细]
  • ThinkPHP 文件缓存组件详解与应用
    本文深入探讨了ThinkPHP框架中的文件缓存类实现,提供了详细的代码示例和使用说明,旨在帮助开发者更好地理解和利用这一功能来优化应用程序性能。 ... [详细]
  • 本文档详细介绍了服务器与应用系统迁移的策略与实施步骤。迁移不仅涉及数据的转移,还包括环境配置、应用兼容性测试等多个方面,旨在确保迁移过程的顺利进行及迁移后的系统稳定运行。 ... [详细]
  • SonarQube配置与使用指南
    本文档详细介绍了SonarQube的配置方法及使用流程,包括环境准备、样本分析、数据库配置、项目属性文件解析以及插件安装等内容,适用于具有Linux基础操作能力的用户。 ... [详细]
  • 解决PHP与MySQL之间的编码不匹配问题
    探讨如何有效解决PHP与MySQL之间常见的编码问题,确保数据的正确传输与显示。 ... [详细]
author-avatar
洪锐林
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有