使用bulk collect insert实现大数据快速迁移

来源:互联网 发布:c语言的平方根 编辑:程序博客网 时间:2024/05/22 06:50

在Oracle 数据库中,将一张表的部分字段转换导入到另外一张表的部分字段中,如"insert into t_target(owner,object_name) from t_source;" 。

这也是解决此类数据迁移的的常规操作方法。

如果源表记录数不是很多,操作操作也无妨。

但是若源表记录数一旦超过百万千万,执行时间就长了,占用的回滚段也大。不小心执行失败,又要全部回滚。

有没有更好的方法,加hint 如nologging append, 甚至parallel 。

这些我认为都不是很好的方法,有有一种方法,称之为bulk collect into 。使用它可以减少操作时间。这是基于数据块的插入方式。

 

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

 

目标表的结构如下:

Sql代码  收藏代码
  1. create table  t_target  
  2. id         number,  
  3.  owner       varchar2(30),  
  4.  object_name varchar2(128),  
  5.  object_id   number,  
  6.  xx          date,  
  7.  yy          varchar2(10)  
  8.    
 

 

 

源表为dba_objects ,表结构在数据库中可以查到。

 

需要将源表dba_objects 中两个字段object_name,owner 两个字段的值复制到t_target 表中。

Sql代码  收藏代码
  1. declare  
  2.   
  3.   type t_array is table of t_target%rowtype;  
  4.   
  5.   t_data t_array;  
  6.   
  7.   cursor c is  
  8.   
  9.     select null id, owner, object_name, null object_id, null xx, null yy  
  10.   
  11.       from dba_objects;  
  12.   
  13. begin  
  14.   
  15.   open c;  
  16.   
  17.   loop  
  18.   
  19.     fetch c bulk collect  
  20.   
  21.       into t_data limit 100;  
  22.   
  23.     forall i in 1 .. t_data.count  
  24.   
  25.       insert into t_target values t_data (i);  
  26.   
  27.     exit when c%notfound;  
  28.   
  29.   end loop;  
  30.   
  31.   close c;  
  32.   
  33.   commit;  
  34.   
  35. end
原创粉丝点击