17,377
社区成员
发帖
与我相关
我的任务
分享
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则这部分数据是恢复不了的。