insert /*+append*/ into (直接插入)logging失效

今天要将下列的表的历史数据分到另一个表中,按照时间来分。

create table RUN_REC_DETAIL
(
  RUN_DETAIL_ID NUMBER(10) not null,
  RUN_ID        VARCHAR2(20),

  RUN_DATE  DATE,
  NOTE_NO              VARCHAR2(50),
  NOTE_EDITION         NUMBER(4),
  FIELD_NUMBER         NUMBER(5),
  FIELD_VALUE          VARCHAR2(4000),
  FIELD_VALUE_CLOB     CLOB
); 此表有5个索引

1.建立一个历史表RUN_REC_DETAIL_HIS,建表语句与上一样;

2. 把5个索引建上;
3. alter table RUN_REC_DETAIL_HIS nologging;

4.insert /*+append*/ into RUN_REC_DETAIL_HIS select d.* from RUN_REC_DETAIL where to_char(RUN_DATE,'yyyy') <'2012';

5. commit;

6.alter table RUN_REC_DETAIL_HIS logging;

这样做测试250万的数据产生了5G的redo,怀疑nologging失效。

然后把表RUN_REC_DETAIL_HIS设置为logging,用insert into RUN_REC_DETAIL_HIS select d.* from RUN_REC_DETAIL where to_char(RUN_DATE,'yyyy') <'2012'; 也是产生5G的redo,证实logging失效。

最后测试是索引的问题,把以上的步骤2放到步骤5的后面,不敢相信产生了仅产生6.8M的redo,然后再建立5个索引,也只产生316M的redo,大大小于先前。


nologging 降低redo只是在部分场景下有效:

1.创建索引和重建索引

2.通过append,使用直接路径批量insert操作或SQL*load 直接路径加载数据

3.CTAS方式创建数据表

4.大对象(LOB)的操作

5.一些alter table move/split

数据库模式 表模式 插入模式 redo生成  
archive log logging append  
  logging no append  
  nologging append  
  nologging no append  
noarchive log logging append  
  logging no append  
  nologging append  
  nologging no append  


你可能感兴趣的:(Oracle,SQL优化)