在对大表插入数据的时候,经常会用到nologging 选项。Nologging 并不是不产生redo,nologging + direct 只是不会对数据产生 redo(但依然有其他的redo)。
同理 logging + direct 下 undo 也是大大地减少, 减少的是 数据的undo , ,就如同 redo的减少也一样,是 ,这和数据库是否产生 redo 和 undo 是不同的概念,比如空间分配的 redo and undo ,这就不是数据本身的变化。
对于nologging 和 logging模式,只有使用 append,才不会对数据生成redo。
只有将表置于nologging 模式,并且使用append 才不会对数据生成redo.
column OLD_VALUE new_value OLD_VALUE
select value OLD_VALUE
from v$mystat, v$statname
where v$mystat.statistic# = v$statname.statistic#
and v$statname.name = ''redo size'';
select (value - &OLD_VALUE) OLD_VALUE
from v$mystat, v$statname
where v$mystat.statistic# = v$statname.statistic#
and v$statname.name = ''redo size'';
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 d:/archivelog
最早的联机日志序列 125
下一个存档日志序列 127
当前日志序列 127
SQL> @?/new.sql
OLD_VALUE
----------
8535492
SQL> create table T_NOLOG as select * from all_objects;
表已创建。
SQL> @?/diff
原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where
新值 1: select (value - 8535492) OLD_VALUE from v$mystat, v$statname where
OLD_VALUE
----------
83496
SQL> @?/new.sql
OLD_VALUE
----------
8618988
SQL> create table T_LOGas select * from all_objects;
表已创建。
SQL> @?/diff
原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where
新值 1: select (value - 8618988) OLD_VALUE from v$mystat, v$statname where
OLD_VALUE
----------
8491836
通过上面的2个例子,可以看出用nologging 创建表,不会对数据生成redo,仅对数据字典生成redo.
SQL> @?/new.sql
OLD_VALUE
----------
17110824
SQL> DELETE FROM T_NOLOG;
已删除71711行。
SQL> @?/diff
原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where
新值 1: select (value - 17110824) OLD_VALUE from v$mystat, v$statname where
OLD_VALUE
----------
26592364
SQL> @?/new.sql
OLD_VALUE
----------
43703188
SQL> DELETE FROM T_LOG;
已删除71712行。
SQL> @?/diff
原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where
新值 1: select (value - 43703188) OLD_VALUE from v$mystat, v$statname where
OLD_VALUE
----------
26592560
SQL> @?/new.sql
OLD_VALUE
----------
70295748
SQL> INSERT INTO T_NOLOG SELECT * FROM ALL_OBJECTS;
已创建71712行。
SQL> @?/diff
原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where
新值 1: select (value - 70295748) OLD_VALUE from v$mystat, v$statname where
OLD_VALUE
----------
8169900
SQL> @?/new.sql
OLD_VALUE
----------
78465648
SQL> INSERT INTO T_LOG SELECT * FROM ALL_OBJECTS;
已创建71712行。
SQL> @?/diff
原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where
新值 1: select (value - 78465648) OLD_VALUE from v$mystat, v$statname where
OLD_VALUE
----------
8169796
SQL> @?/new.sql
OLD_VALUE
----------
86635444
SQL> UPDATE T_NOLOG SET OBJECT_ID=1;
已更新71712行。
SQL> @?/diff
原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where
新值 1: select (value - 86635444) OLD_VALUE from v$mystat, v$statname where
OLD_VALUE
----------
24323896
SQL> @?/new.sql
OLD_VALUE
----------
110959340
SQL> UPDATE T_LOG SET OBJECT_ID=1;
已更新71712行。
SQL> @?/diff
原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where
新值 1: select (value - 110959340) OLD_VALUE from v$mystat, v$statname where
OLD_VALUE
----------
36490988
insert/update/delete 的DML 操作,在logging和nologging上没有区别
SQL> @?/new.sql
OLD_VALUE
----------
147450328
SQL> INSERT INTO T_NOLOG SELECT * FROM ALL_OBJECTS;
已创建71712行。
SQL> @?/diff
原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where
新值 1: select (value - 147450328) OLD_VALUE from v$mystat, v$statname where
OLD_VALUE
----------
8325816
SQL> @?/new.sql
OLD_VALUE
----------
155776144
SQL> INSERT /*+ APPEND */ INTO T_NOLOG SELECT * FROM ALL_OBJECTS;
已创建71712行。
SQL> @?/diff
原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where
新值 1: select (value - 155776144) OLD_VALUE from v$mystat, v$statname where
OLD_VALUE
----------
14852
SQL> @?/new.sql
OLD_VALUE
----------
155790996
SQL> INSERT /*+ APPEND */ INTO T_LOG SELECT * FROM ALL_OBJECTS;
已创建71712行。
SQL> @?/diff
原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where
新值 1: select (value - 155790996) OLD_VALUE from v$mystat, v$statname where
OLD_VALUE
----------
8406068
将表改为nologging 模式,在查看
SQL> @?/new.sql
OLD_VALUE
----------
164200200
SQL> INSERT /*+ APPEND */ INTO T_LOG SELECT * FROM ALL_OBJECTS;
已创建71712行。
SQL> @?/diff
原值 1: select (value - &OLD_VALUE) OLD_VALUE from v$mystat, v$statname where
新值 1: select (value - 164200200) OLD_VALUE from v$mystat, v$statname where
OLD_VALUE
----------
15012
注:REDO SIZE=27956
通过实验看出,
对于logging 模式, 使用append hint 在生成redo 上没有什么变化
对于nologging模式,使用append hint 对数据没有生成redo,仅对数据字典生成了redo.