Oracle 减少redo size的方法

已有 1270 次阅读2013-3-5 23:22 |个人分类:Oracle 性能优化| , , Oracle

用实验说明

一、在非归档模式下:

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

用sys用户创建查询redo size的视图(方便查询)
  1. SQL> create or replace view redo_size  
  2.   2  as  
  3.   3  select value  
  4.   4    from v$mystat, v$statname  
  5.   5  where v$mystat.statistic# = v$statname.statistic#  
  6.   6     and v$statname.name = 'redo size';  
  7.   
  8. 视图已创建。  

用sys用户创建同义词

  1. SQL> create public synonym redo_size for redo_size;  
  2.   
  3. 同义词已创建。  

以下用scott操作

创建测试表

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

查看当前redo量
  1. SQL> select * from redo_size;  
  2.   
  3.      VALUE  
  4. ----------  
  5.        736  

插入数据,看结果
  1. SQL> insert into test_redos select * from dba_objects;  
  2.   
  3. 已创建73104行。  
  4.   
  5. SQL> select * from redo_size;  
  6.   
  7.      VALUE  
  8. ----------  
  9.    8473536  
  10.   
  11. SQL> insert /*+ append */ into test_redos select * from dba_objects;  
  12.   
  13. 已创建73100行。  
  14.   
  15. SQL> select * from redo_size;  
  16.   
  17.      VALUE  
  18. ----------  
  19.    8504856  
  20.   
  21. SQL> select (8473536-736)普通插入,(8504856-8473536) append插入 from dual;  
  22.   
  23.   普通插入 APPEND插入  
  24. ---------- ----------  
  25.    8472800      31320  

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


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

  1. SQL> archive log list;  
  2. Database log mode              Archive Mode  
  3. Automatic archival             Enabled  
  4. Archive destination            /archive1  
  5. Oldest online log sequence     114  
  6. Next log sequence to archive   116  
  7. Current log sequence           116  

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

①:在表为logging的情况下

  1. SQL>  create table test_redos as select * from dba_objects where 1=2;  
  2.   
  3. Table created.  
  4.   
  5. SQL> select * from redo_size;  
  6.   
  7.      VALUE  
  8. ----------  
  9.      26812  
  10.   
  11. SQL> insert into test_redos select * from dba_objects;  
  12.   
  13. 71971 rows created.  
  14.   
  15. SQL> select * from redo_size;  
  16.   
  17.      VALUE  
  18. ----------  
  19.    8490044  
  20.   
  21. SQL> insert /*+ append */ into test_redos select * from dba_objects;  
  22.   
  23. 71971 rows created.  
  24.   
  25. SQL> select * from redo_size;  
  26.   
  27.      VALUE  
  28. ----------  
  29.   17001396  
  30.   
  31. SQL> select (8490044-26812)普通插入,(17001396-8490044) append插入 from dual;  
  32.   
  33.   普通插入 APPEND插入  
  34. ---------- ----------  
  35.    8463232    8511352  
  36.    

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

②:在表nologging的情况下

将表设置为nologging模式

  1. SQL> alter table test_redos nologging;  
  2.   
  3. Table altered.  
继续测试
  1. SQL> select * from redo_size;  
  2.   
  3.      VALUE  
  4. ----------  
  5.    8397184  
  6.   
  7. SQL> insert into test_redos select * from dba_objects;  
  8.   
  9. 71971 rows created.  
  10.   
  11. SQL> select * from redo_size;  
  12.   
  13.      VALUE  
  14. ----------  
  15.   16801072  
  16.   
  17. SQL> insert /*+ append */ into test_redos select * from dba_objects;  
  18.   
  19. 71971 rows created.  
  20.   
  21. SQL> select * from redo_size;  
  22.   
  23.      VALUE  
  24. ----------  
  25.   16836516  
  26.   
  27. SQL> select (16801072-8397184)普通插入,(16836516-16801072) append插入 from dual;  
  28.   
  29.   普通插入 APPEND插入  
  30. ---------- ----------  
  31.    8403888      35444  

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

三、在归档force logging模式下:

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

  1. SQL> select username,default_tablespace from dba_users where username='SCOTT';  
  2.   
  3. USERNAME                       DEFAULT_TABLESPACE  
  4. ------------------------------ ------------------------------  
  5. SCOTT                          USERS  
  6. --在数据级别置为force logging模式语句为 alter database force logging;  
  7. SQL> alter tablespace users force logging;  
  8.   
  9. Tablespace altered.  
继续测试
  1. SQL> select * from redo_size;  
  2.   
  3.      VALUE  
  4. ----------  
  5.   25488368  
  6.   
  7. SQL> insert into test_redos select * from dba_objects;  
  8.   
  9. 72010 rows created.  
  10.   
  11. SQL> select * from redo_size;  
  12.   
  13.      VALUE  
  14. ----------  
  15.   33973556  
  16.   
  17. SQL> insert /*+ append */ into test_redos select * from dba_objects;  
  18.   
  19. 72010 rows created.  
  20.   
  21. SQL> select * from redo_size;  
  22.   
  23.      VALUE  
  24. ----------  
  25.   42492396  
  26.   
  27. SQL> select (33973556-25488368)普通插入,(42492396-33973556) append插入 from dual;  
  28.   
  29.   普通插入 APPEND插入  
  30. ---------- ----------  
  31.    8485188    8518840  
  32.    

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


总结:

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

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

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 加入社区

他的关注

意见
反馈