ITPub博客

首页 > 数据库 > Oracle > Oracle Nologging详解

Oracle Nologging详解

原创 Oracle 作者:DBhanG 时间:2020-05-31 19:47:56 0 删除 编辑

Nologging :

在对大表插入数据的时候,经常会用到nologging选项。 Nologging并不是不产生 redo,

Nologging+append 只是不会对数据产生 redo(但依然有其他的 redo,例如数据字典变化产生的 redo)。

同理 logging+append下 undo也是大大地减少,减少的是数据的 undo,是数据本身的 undo,就如同 redo的减少也一样,是数据本身的 redo。

这和数据库是否产生redo和 undo是不同的概念,比如空间分配的 redo和 undo,这就不是数据本身的变化。


N ologging 主要影响:  

sql loader 直接路径加载

直接路径的insert (append hint)

create table as select

alter table move  

创建和重建索引

 

在非归档 模式下,   对于 nologging  和  logging 模式,使用  append ,都不会对数据生成 redo 。 

在归档模式下, 只有将表置于 nologging  模式,并且使用 append  才不会对数据生成 redo. 

 

通过v$mystat视图来显示出当前会话产生的 redo来进行显示效果:

select a.name,b.value from v$statname a,v$mystat b   where a.statistic# = b.statistic# and a.name='redo size';

 

测试:

测试前一定要确定是否开始force_logging功能:

如果开启force_logging功能,那么 nologging是不生效的。

SYS@prod>select force_logging from v$database;

FOR

---

NO

如果结果是YES,那么进行关闭

Alter database no force logging;

归档模式下的测试:

SYS@prod>archive log list;

Database log mode        Archive Mode

Automatic archival        Enabled

Archive destination        /u01/app/oracle/arch/pridb

Oldest online log sequence     230

Next log sequence to archive   232

Current log sequence        232

 

Create table 测试:

查看当前会话产生的redo值:

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size           0

 

Nologging测试:

SYS@prod>create table test nologging as select * from dba_objects;

Table created.

 

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size             54928

产生redo大小为 54928。

 

SYS@prod>drop table test;     

Table dropped.

 

Logging 测试 :

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size           0

 

SYS@prod>create table test logging as select * from dba_objects;

Table created.

 

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size          10262796

产生redo数量为 10262796.

 

结论:用 nologging  创建表,不会对数据生成 redo ,仅对数据字典生成 redo. 

 

DML测试:

Insert update delete

Delete:

表logging:

SYS@prod>delete from test;

86978 rows deleted.

 

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size          32996412

 

表nologging :

SYS@prod>delete from test;

86978 rows deleted.

 

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size          32991352

 

Insert 与 update测试就省略了,与 delete效果一样。

结论:

对于 INSERT/UPDATE/DELETE的DML 操作, nologging 和 logging 模式没有什么区别。

 

使用直接路径append对 insert测试:

表logging 使用 append插入:

SYS@prod>create table test logging as select * from dba_objects;

Table created.

为了测试效果明显,重新启动一个会话。

 

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size           0

 

SYS@prod>insert /*+APPEND*/ into test select * from test;

86980 rows created.

 

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size          10239296

 

表nologging使用 append插入:

SYS@prod>create table test nologging as select * from dba_objects;

Table created.

为了测试效果明显,重新启动一个会话。

 

SYS@prod>insert /*+APPEND*/ into test select * from test;

86980 rows created.

 

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size             13884

 

结论:

对于 logging  模式, 使用 append hint  在生成 redo  上没有什么变化

对于 nologging 模式,使用 append hint  对数据没有生成 redo ,仅对数据字典生成了 redo.

 

Alter table move测试:

表Logging模式下进行移动:

SYS@prod>create table test logging as select * from dba_objects;

Table created.

重启一个会话

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size           0

 

SYS@prod>alter table test move tablespace example

 

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size          10330784

 

表nologging模式下进行移动:

SYS@prod>create table test nologging as select * from dba_objects;

Table created.

重启一个会话

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size           0

SYS@prod>alter table test move tablespace example;

Table altered.

 

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size             71712

结论:表在nologging模式下进行移动,不会记录数据 redo,仅会记录数据字典变化的 redo。

非归档模式下的测试:

SYS@prod>archive log list;

Database log mode        No Archive Mode

Automatic archival        Disabled

Archive destination        /u01/app/oracle/arch/pridb

Oldest online log sequence     250

Current log sequence        252

 

1.create table 测试

Logging建表:

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size           0

 

SYS@prod>create table test logging as select * from dba_objects;

Table created.

 

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size             54476

 

Nologging建表:

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size           0

 

SYS@prod>create table test nologging as select * from dba_objects;

Table created.

 

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size             53700

 

结论:在非归档模式下,nologging和 logging方式建表差距不大。

 

2.DML测试:(仅测试 insert)

Insert:

表Nologging

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size           0


SYS@prod>insert into test select * from test;

86980 rows created.


SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size          10153240

 

表Logging:

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size           0


SYS@prod>insert into test select * from test;

86980 rows created.


SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size          10162700

 

结论:

对于 INSERT/UPDATE/DELETE的 DML 操作, nologging 和 logging 模式没有什么区别

 

 

3.Insert+Append测试:

Logging:

SYS@prod>create table test logging as select * from dba_objects;

Table created.

重启一个会话

 

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size           0

 

SYS@prod>insert /*+APPEND*/ into test select * from test;

86980 rows created.

 

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size             13752

 

Nologging:

SYS@prod>create table test nologging as select * from dba_objects;

 

Table created.

重启一个会话:

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size           0

 

SYS@prod>insert /*+APPEND*/ into test select * from test;

86980 rows created.

 

SYS@prod>select a.name,b.value from v$statname a,v$mystat b where a.statistic# = b.statistic# and a.name='redo size';

NAME               VALUE

---------------------------------------------------------------- ----------

redo size             13884

总结:  对于非归档模式,对于 nologging  和  logging 模式,使用  append ,都不会对数据生成 redo 。 

对于归档模式,只有nologging+Append,才不会对数据生成 redo,仅对数据字典生成 redo

 

两种模式下的测试结论:

归档模式下:

用 nologging  创建表,不会对数据生成 redo ,仅对数据字典生成 redo. 

insert/update/delete 的DML 操作,在logging和nologging上没有区别

对于logging 模式, 使用append hint 在生成redo 上没有什么变化

对于nologging模式,使用append hint 对数据没有生成redo,仅对数据字典生成了redo 。

 

非归档模式:

在非归档模式下,create table 在nologging 和 logging 模式差别不大。

对于 INSERT/UPDATE/DELETE的DML 操作, nologging 和 logging 上没有区别。

对于nologging 和 logging模式,使用 append, 都不会对数据生成redo。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69975956/viewspace-2695348/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: Oracle AWR内容详解
请登录后发表评论 登录
全部评论

注册时间:2020-05-28

  • 博文量
    59
  • 访问量
    71332