今天要将下列的表的历史数据分到另一个表中,按照时间来分。
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 | 有 |