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

在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语句搞定这个数据处理,简单。

相关推荐