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 logloggingappend 
 loggingno append 
 nologgingappend 
 nologgingno append 
noarchive logloggingappend 
 loggingno append 
 nologgingappend 
 nologgingno append 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值