redo与append关系

本文通过实验对比分析了数据库在归档和非归档模式下,不同表模式(Logging与No Logging)及插入方式(常规与Append)对REDO日志生成的影响。
我这个帖子从数据库运行模式,表模式和是否直接路径插入三方面结合来讨论下:
实验准备
(1)创建计算当前session产生的redo size的视图 :
create view redo_size as
select a.name,b.value
  from v$statname a,v$mystat b
where a.statistic#=b.statistic# and a.name='redo size';
(2)建表结构:
sys@HX> create table t1 as select * from dba_objects where 1=2;

Table created.

1. 讨论数据库运行在归档模式的情况:
sys@HX> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     0
Next log sequence to archive   77
Current log sequence           77

(1)表模式是logging的情况
sys@HX> select table_name,logging from user_tables where table_name='T1';
TABLE_NAME                    |LOG
------------------------------|---
T1                            |YES

1 row selected.

sys@HX> select * from redo_size;
NAME                          |     VALUE
------------------------------|----------
redo size                     |     70768

sys@HX> insert into t1 select * from dba_objects;

15621 rows created.

sys@HX> select * from redo_size;
NAME                          |     VALUE
------------------------------|----------
redo size                     |   1777308

1 row selected.

sys@HX> insert /*+ append */ into t1 select * from dba_objects;  

15621 rows created.

sys@HX> select * from redo_size;                               
NAME                          |     VALUE
------------------------------|----------
redo size                     |   3474632

1 row selected.

比较两种插入方式的日志量:
sys@HX> select 3474632-1777308 as redo_append,1777308-70768 as redo_normal from dual;
REDO_APPEND|REDO_NORMAL
-----------|-----------
    1697324|    1706540


1 row selected.

基本一致,也就是说归档模式下,对于logging的表,即时使用了append插入方式也会产生redo

(2)表模式是nologging的情况
sys@HX> alter table t1 nologging;

Table altered.

sys@HX> select table_name,logging from user_tables where table_name='T1';                  
TABLE_NAME                    |LOG
------------------------------|---
T1                            |NO


sys@HX> select * from redo_size;                                                                           
NAME                          |     VALUE
------------------------------|----------
redo size                     |         0

sys@HX> insert into t1 select * from dba_objects;

15621 rows created.

sys@HX> select * from redo_size;                 
NAME                          |     VALUE
------------------------------|----------
redo size                     |   1707544

1 row selected.


sys@HX> insert /*+ append */ into t1 select * from dba_objects;

15621 rows created.

sys@HX> select * from redo_size;                               
NAME                          |     VALUE
------------------------------|----------
redo size                     |   1710220

1 row selected.

sys@HX> select 1710220-1707544 as redo_append,1707544  as redo_normal from dual;
REDO_APPEND|REDO_NORMAL
-----------|-----------
       2676|    1707544

1 row selected.

可以看到,归档模式下,对于nogging的表,普通方式插入数据还是会产生redo,使用了APPEND插入数据则不会产生redo:

2.讨论非归档模式:

sys@HX> archive log list;
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     0
Current log sequence           77

(1)表模式是logging的情况
sys@HX> alter table t1 logging;

Table altered.


sys@HX> select table_name,logging from user_tables where table_name='T1';
TABLE_NAME                    |LOG
------------------------------|---
T1                            |YES

sys@HX> select * from redo_size; 
NAME                          |     VALUE
------------------------------|----------
redo size                     |         0

1 row selected.

sys@HX> insert   into t1 select * from dba_objects;                                          

15621 rows created.

sys@HX> select * from redo_size;
NAME                          |     VALUE
------------------------------|----------
redo size                     |   1706524

1 row selected.

sys@HX> insert /*+ append */ into t1 select * from dba_objects;

15621 rows created.

sys@HX> select * from redo_size;                               
NAME                          |     VALUE
------------------------------|----------
redo size                     |   1709244

1 row selected.

sys@HX> select 1709244-1706524 redo_append,1706524 redo_normal from dual;
REDO_APPEND|REDO_NORMAL
-----------|-----------
       2720|    1706524

1 row selected.

在非归档模式,表模式是logging情况下,直接路径插入方式不会产生redo

(2)表模式是nologging的情况

sys@HX> alter table t1 nologging;


Table altered.

sys@HX> select table_name,logging from user_tables where table_name='T1';
TABLE_NAME                    |LOG
------------------------------|---
T1                            |NO

1 row selected.


sys@HX> select * from redo_size;                               
NAME                          |     VALUE
------------------------------|----------
redo size                     |         0

1 row selected.

sys@HX> insert   into t1 select * from dba_objects;                                          


15621 rows created.


sys@HX> select * from redo_size;                   
NAME                          |     VALUE
------------------------------|----------
redo size                     |   1707544

1 row selected.

sys@HX> insert /*+ append */ into t1 select * from dba_objects;

15621 rows created.

sys@HX> select * from redo_size;                               
NAME                          |     VALUE
------------------------------|----------
redo size                     |   1710220

1 row selected.

sys@HX> select 1710220-1707544 redo_append,1707544 redo_normal from dual;  
REDO_APPEND|REDO_NORMAL
-----------|-----------
       2676|    1707544

1 row selected.
非归档模式下,表模式是nologging时,append方式插入不会有redo,普通插入方式还是会产生redo

可以用一个表格展示这个关系:
  

数据库运行模式

  

表模式

插入模式

是否有redo生成

归档

logging

No  append

append

nologging

No  append

append

非归档

logging

No  append

append

nologging

No  append

append



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值