法一:使用ddl(create/alter/drop/truncate等)语言,尽量避免或减少redo、undo操作, 开并行,不打印日志
create table tmp1 parallel 8 nologging as
select /*+parallel(8)/ id, rownum as newid, create_time from user;
法二:开启dml(insert/delete/update/select等)并行,关闭日志,先删除索引和触发器,禁用约束
insert /*+append parallel(8) enable_parallel_dml */ into tmp1
nologging
select /*+parallel(8)/ id, rownum as newid, create_time from user;
--验证sql
select vs.name, ms.value
from v$mystat ms, v$sysstat vs
where ms.statistic# = vs.statistic#
and name = 'undo change vector size';
1、DDL作为数据库定义语言是不能进行rollback(回滚),提交方式也是隐性提交,且只生成少量undo记录以应对ddl操作中途失败的情况;
2、DML是可以进行rollback的,并且对于事务(transaction)的提交是显式的(默认),需要commit才能真正被执行,可以设置为隐式提交。
oracle的临时表,不会生成redo, 但是会生成undo. 所以它也是不能恢复的。
Undo信息生成的DML排名(少—>多)
Insert语句生成很少的Undo,因为只为rowid生成Undo;
update语句的Undo集中在被修改的字段上面, 而如果是带索引的字段修改,那么Undo是2.5倍;
delete生成的Undo最多,整行的生成,所以开销是最大。