求insert into select 不占用回滚段的办法

golden24kcn 2011-04-17 12:39:14
想从A库导数据到B库中,有可能每次提交数据行数过亿,用dblink来做insert into select

有什么办法让oracle不打开事务吗?或者不占用undo表空间就行。
...全文
353 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
golden24kcn 2011-04-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bobo12082119 的回复:]

SQL code

SQL> create table t as
2 select object_name from all_objects
3 where 1=0;
--查看使用的undo块
SQL> select used_ublk
2 from v$transaction
3 where addr=
4 (select taddr
5 from v$……
[/Quote]


我想从A库向B库导入数据,表1数据量3.8G,

我的SQL:

insert into 新表1
SELECT * from 表1@db_link

用了几个小时,undo涨到了6G多

现在有张37G的表,用EXP导出就报错,所以也想试试用 insert into select来导

我是否应该这样写:
insert /* APPEND */ into 新表2 select * from 表2

304的的哥 2011-04-17
  • 打赏
  • 举报
回复

SQL> create table t as
2 select object_name from all_objects
3 where 1=0;
--查看使用的undo块
SQL> select used_ublk
2 from v$transaction
3 where addr=
4 (select taddr
5 from v$session
6 where sid=(select sid from v$mystat where rownum=1));

USED_UBLK
----------

--
SQL> insert into t(object_name)
2 select object_name from all_objects
3 where 1=1;
47750 rows inserted
--添加数据后,生成了小量的undo块
SQL> select used_ublk
2 from v$transaction
3 where addr=
4 (select taddr
5 from v$session
6 where sid=(select sid from v$mystat where rownum=1));
USED_UBLK
----------
389
--
--update将会生成大量的undo块,
SQL> update t set object_name=lower(object_name);
47750 rows updated
SQL> select used_ublk
2 from v$transaction
3 where addr=
4 (select taddr
5 from v$session
6 where sid=(select sid from v$mystat where rownum=1));
USED_UBLK
----------
779
--
insert /*+ append */ into select 生成更少量的undo;
在使用了append选项以后,insert数据会直接加到表的最后面,
而不会在表的空闲块中插入数据。
使用append会增加数据插入的速度。
/*+APPEND*/的作用是在表的高水位上分配空间,不再使用表的extent中的空余空间
append 属于direct insert,归档模式下append+table nologging会大量减少日志,
非归档模式append会大量减少日志,append方式插入只会产生很少的undo,
不去寻找 freelist 中的free block , 直接在table HWM 上面加入数据。
注意:append+nologging增加的数据如果数据增加完成后不备份,
那么如果数据库cash则这部分数据是恢复不了的。
golden24kcn 2011-04-17
  • 打赏
  • 举报
回复
我现在用的
insert /* APPEND */ into 新表2 select * from 表2

感觉速度也还可以,也没有占用UNDO,我看到源表中有extent

有什么办法可以分区来insert into select 吗?
liuyi8903 2011-04-17
  • 打赏
  • 举报
回复
你可以使用TTS呀。

如果你并不是单独占一个tablespace的话,

可以先做partition exchange之后再tts.

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧