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则这部分数据是恢复不了的。
我想从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
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则这部分数据是恢复不了的。
SELECT * from 表1@db_link用了几个小时,undo涨到了6G多现在有张37G的表,用EXP导出就报错,所以也想试试用 insert into select来导我是否应该这样写:
insert /* APPEND */ into 新表2 select * from 表2
insert /* APPEND */ into 新表2 select * from 表2 感觉速度也还可以,也没有占用UNDO,我看到源表中有extent有什么办法可以分区来insert into select 吗?