把结论写在前面:
nologging选项在parallel提示下不能起到作用。
nologging选项只有在append提示下才能起到作用。
并且跟是否启用归档相关,具体如下
1)在归档模式下
只有将表设置为nologging,并且使用了append hints的语句才有nolog的作用。
2)在非归档模式下
将表设置为nologging+append hints,或者语句指定nologging+append hints,或者语句使用append hints,这3种情况都可以起到nolog的作用。
关于nologging和append的实验
首先我们在archivelog模式下来作这个实验。
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 e:oracleora92RDBMS
最早的概要日志序列 12
下一个存档日志序列 14
当前日志序列 1
SQL> select count(*) from test;
COUNT(*)
----------
198
SQL> create table test1 as select * from test where 1=2 ;
表已创建。
SQL> create table test2 as select * from test where 1=2 ;
表已创建。
SQL> create table test3 as select * from test where 1=2 ;
表已创建。
SQL> create table test4 as select * from test where 1=2 ;
表已创建。
SQL> create table test5 nologging as select * from test where 1=2 ;
表已创建。
SQL> alter table test4 nologging;
表已更改。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statname.statistic# and v$statname.name = 'redo size';
VALUE
----------
441444
SQL> insert into test1 select * from test nologging ;
已创建198行。
SQL> commit;
提交完成。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statname.statistic# and v$statname.name = 'redo size';
VALUE
----------
495100 -- redo size : 53656
SQL> insert /*+ APPEND */ into test2 nologging select * from test;
已创建198行。
SQL> commit;
提交完成。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statname.statistic# and v$statname.name = 'redo size';
VALUE
----------
556112 --redo size: 61012
SQL> alter session enable parallel dml;
会话已更改。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statna
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
556112
SQL> insert /*+parallel(test3)*/ into test3 nologging select * from test ;
已创建198行。
SQL> commit;
提交完成。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statna
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
609784 -- redo size:53672
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statna
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
609784
SQL> insert into test4 select * from test ;
已创建198行。
SQL> commit;
提交完成。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statna
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
663456 -- redo size:53672
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statna
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
708700
SQL> insert /*+append*/ into test5 select * from test;
已创建198行。
SQL> commit;
提交完成。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statna
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
711840 -- redo size:3140
这上面的实验是在archivelog模式下作的。从上面的实验,我们可以得出的结论是:
archivelog模式下,将表设置为logging模式,则同时指定nologging和append也起不到nolog的作用。
将表设置为nologging模式,在指定append的模式下,可以起到nolog的作用,在归档模式下,也只有这种情况下是nolog的。
再看一下noarchivelog模式下的情况
SQL> alter database noarchivelog ;
数据库已更改。
SQL>
SQL> alter database open ;
数据库已更改。
SQL>
SQL> conn xigua/xigua ;
已连接。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statna
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
1364
SQL> insert into test1 select * from test ;
已创建198行。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statn
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
55048 -- redo size:53684
SQL> insert /*+append */ into test1 select * from test;
已创建198行。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statn
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
57248 -- redo size:2200
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statna
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
108908
SQL> insert into test1 select * from test nologging ;
已创建198行。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statname.statistic# and v$statname.name = 'redo size';
VALUE
----------
162092 -- redo size:53184
SQL> alter table test2 nologging;
表已更改。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statna
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
165880
SQL> insert into test2 select * from test;
已创建198行。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statna
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
219564 --redo size :53684
SQL> insert /*+append*/ into test2 select * from test ;
已创建198行。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statna
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
221764 --redo size : 2200
SQL> commit;
提交完成。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statna
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
223052
SQL> insert into test2 select * from test nologging;
已创建198行。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statna
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
273364 -- redo size : 50312
SQL> commit;
提交完成。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statna
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
377288
SQL> insert /*+parallel(test2)*/ into test2 nologging select * from test ;
已创建198行。
SQL> select value from v$mystat, v$statname where v$mystat.statistic# = v$statna
me.statistic# and v$statname.name = 'redo size';
VALUE
----------
430500 redo size : 53212
总结:在非归档模式下,append都能起到nolog的作用。
但是parallel却不能起到nolog的作用。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10867315/viewspace-194836/ ,如需转载,请注明出处,否则将追究法律责任。