在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
)
目标表的结构如下:
create table t_target
(id number,
owner varchar2(30),
object_name varchar2(128),
object_id number,
xx date,
yy varchar2(10)
)
源表为dba_objects
,表结构在数据库中可以查到。
需要将源表dba_objects
中两个字段object_name,owner
两个字段的值复制到t_target
表中。
declare
type t_array is table of t_target%rowtype;
t_data t_array;
cursor c is
select null id, owner, object_name, null object_id, null xx, null yy
from dba_objects;
begin
open c;
loop
fetch c bulk collect
into t_data limit 100;
forall i in 1 .. t_data.count
insert into t_target values t_data (i);
exit when c%notfound;
end loop;
close c;
commit;
end;
Fastest
- Explicit cursors doing a BULK COLLECT into a local collection (with an appropriate LIMIT) and using FORALL to write back to the database.
- Implicit cursors doing a BULK COLLECT for you behind the scenes along with single-row writes back to the datbase.
- Explicit cursors that are not doing a BULK COLLECT and not taking advantage of PL/SQL collections.
顺便说一下,这里开发人员多,如果碰到类似要求的,各位可以测试一下这个方法。试试在更大数据量的执行时间和成本会变的如何?
分享到:
相关推荐
详细介绍了使用 BULK COLLECT 进行批量操作 提高sql的执行效率 使用MERGE INTO USING 一条sql搞定 新增和修改 使用connect by 进行递归树查询
Oracle 中使用 fetch bulk collect into 批量效率的读取游标数据
结合一个存储过程的实例,介绍了 bulk collect 的使用
采用bulk collect可以将查询结果一次性地加载到collections中。...可以在select into,fetch into,returning into语句使用bulk collect。注意在使用bulk collect时,所有的into变量都必须是collections.
记录 集合 BULK COLLECT FORALL 执行计划
bulk collect函数的使用,可以可以提高数据的访问效率
sal,ename BULK COLLECT INTO sal,ename BULK COLLECT INTO sal,ename BULK COLLECT INTO vsal,ename BULK COLLECT INTO sal,ename BULK COLLECT INTO sal,ename BULK COLLECT INTO sal,ename BULK COLLECT ...
bulk collect bulk collect bulk collect例子特殊应用
BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer用法笔记。对oracle批量查询 删除 更新使用bulk collect提高效果的相关知识感兴趣的朋友通过本文一起学习吧
Collect是用 Visual C++ 语言开发的
我们知道PL/SQL程序中运行SQL语句是存在...下面详解这爷俩㈠ 通过BULK COLLECT 加速查询⑴ BULK COLLECT 的用法采用BULK COLLECT可以将查询结果一次性地加载到collections中,而不是通过cursor一条一条地处理可以在sele
在一般的情况下,使用批量fetch的几率并不是很多,但是Oracle提供了这个功能我们最好能熟悉一下,说不定什么时候会用上它。 代码如下:declare cursor c1 is select * from t_depart; v_depart t_depart%...
Oracle 遍历游标的四种方式(for、fetch、while、bulk collect+forall) 2.问题分析 我们可以把游标想象成一张表,想要遍历游标,就要取到游标的每行数据,所以问题的关键就成了:如何取到行数据? 3.解决方案 ...
代码如下: — Created on 2010/11/04 by WANGNAN declare — Local variables here i integer; TYPE t_table IS TABLE OF VARCHAR2(10 ) INDEX BY VARCHAR2 (2); v_t_table t_table; TYPE t_pg3 IS TABLE OF asis.PG...
COLLECT
com.google.common.collect.Maps; Maps.newConcurrentMap();