实验证明 Oracle能减少redo size的方法

本帖最后由 fishcat 于 2013-3-5 23:27 编辑


用实验说明

一、在非归档模式下:

[sql] view plaincopy

    SQL> archive log list  
    数据库日志模式             非存档模式  
    自动存档             禁用  
    存档终点            USE_DB_RECOVERY_FILE_DEST  
    最早的联机日志序列     2491  
    当前日志序列           2493  


用sys用户创建查询redo size的视图(方便查询)

[sql] view plaincopy

    SQL> create or replace view redo_size  
      2  as  
      3  select value  
      4    from v$mystat, v$statname  
      5  where v$mystat.statistic# = v$statname.statistic#  
      6     and v$statname.name = 'redo size';  
      
    视图已创建。  

用sys用户创建同义词

[sql] view plaincopy

    SQL> create public synonym redo_size for redo_size;  
      
    同义词已创建。  


以下用scott操作

创建测试表

[sql] view plaincopy

    SQL> create table test_redos as select * from DBA_objects where 1=2;  
      
    表已创建。  


查看当前redo量

[sql] view plaincopy

    SQL> select * from redo_size;  
      
         VALUE  
    ----------  
           736  


插入数据,看结果

[sql] view plaincopy

    SQL> insert into test_redos select * from dba_objects;  
      
    已创建73104行。  
      
    SQL> select * from redo_size;  
      
         VALUE  
    ----------  
       8473536  
      
    SQL> insert /*+ append */ into test_redos select * from dba_objects;  
      
    已创建73100行。  
      
    SQL> select * from redo_size;  
      
         VALUE  
    ----------  
       8504856  
      
    SQL> select (8473536-736)普通插入,(8504856-8473536) append插入 from dual;  
      
      普通插入 APPEND插入  
    ---------- ----------  
       8472800      31320  


以上结果说明在非归档模式下,append插入数据产生的redo要少得多。


二、在归档模式下(在数据库和表空间级别为设置force logging的情况下,默认非force logging):

[sql] view plaincopy

    SQL> archive log list;  
    Database log mode              Archive Mode  
    Automatic archival             Enabled  
    Archive destination            /archive1  
    Oldest online log sequence     114  
    Next log sequence to archive   116  
    Current log sequence           116  


同上(非归档里面)建立测试表

①:在表为logging的情况下

[sql] view plaincopy

    SQL>  create table test_redos as select * from dba_objects where 1=2;  
      
    Table created.  
      
    SQL> select * from redo_size;  
      
         VALUE  
    ----------  
         26812  
      
    SQL> insert into test_redos select * from dba_objects;  
      
    71971 rows created.  
      
    SQL> select * from redo_size;  
      
         VALUE  
    ----------  
       8490044  
      
    SQL> insert /*+ append */ into test_redos select * from dba_objects;  
      
    71971 rows created.  
      
    SQL> select * from redo_size;  
      
         VALUE  
    ----------  
      17001396  
      
    SQL> select (8490044-26812)普通插入,(17001396-8490044) append插入 from dual;  
      
      普通插入 APPEND插入  
    ---------- ----------  
       8463232    8511352  
      


可以看出在归档模式表logging(默认)的情况下,append插入产生的redo量并不会减少。

②:在表nologging的情况下

将表设置为nologging模式

[sql] view plaincopy

    SQL> alter table test_redos nologging;  
      
    Table altered.  

继续测试

[sql] view plaincopy

    SQL> select * from redo_size;  
      
         VALUE  
    ----------  
       8397184  
      
    SQL> insert into test_redos select * from dba_objects;  
      
    71971 rows created.  
      
    SQL> select * from redo_size;  
      
         VALUE  
    ----------  
      16801072  
      
    SQL> insert /*+ append */ into test_redos select * from dba_objects;  
      
    71971 rows created.  
      
    SQL> select * from redo_size;  
      
         VALUE  
    ----------  
      16836516  
      
    SQL> select (16801072-8397184)普通插入,(16836516-16801072) append插入 from dual;  
      
      普通插入 APPEND插入  
    ---------- ----------  
       8403888      35444  


可以看出在表nologging的模式下,append可以减少大量减少redo量的产生。

三、在归档force logging模式下:

改变SCOTT用户的默认表空间为force logging模式

[sql] view plaincopy

    SQL> select username,default_tablespace from dba_users where username='SCOTT';  
      
    USERNAME                       DEFAULT_TABLESPACE  
    ------------------------------ ------------------------------  
    SCOTT                          USERS  
    --在数据级别置为force logging模式语句为 alter database force logging;  
    SQL> alter tablespace users force logging;  
      
    Tablespace altered.  

继续测试

[sql] view plaincopy

    SQL> select * from redo_size;  
      
         VALUE  
    ----------  
      25488368  
      
    SQL> insert into test_redos select * from dba_objects;  
      
    72010 rows created.  
      
    SQL> select * from redo_size;  
      
         VALUE  
    ----------  
      33973556  
      
    SQL> insert /*+ append */ into test_redos select * from dba_objects;  
      
    72010 rows created.  
      
    SQL> select * from redo_size;  
      
         VALUE  
    ----------  
      42492396  
      
    SQL> select (33973556-25488368)普通插入,(42492396-33973556) append插入 from dual;  
      
      普通插入 APPEND插入  
    ---------- ----------  
       8485188    8518840  
      


可以看出在表空间在force logging模式下append不能减少redo量


总结:

非归档模式下:append能大量减少redo量。

归档模式下:在表空间和数据库级非force logging模式下,表如果是nologging,则append能大量减少redo量。
标签: 暂无标签
fishcat

写了 55 篇文章,拥有财富 503,被 40 人关注

oracle爱好者
转播转播 分享分享 分享淘帖
回复

使用道具

成为第一个吐槽的人

您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

意见
反馈