那些可以 NOLOGGING 执行的操作

先弄清:什么绝对不能 NOLOGGING

  • 普通 INSERT / UPDATE / DELETE / MERGE 这些 DML 无论如何都会记 redo,别打它们的主意了。

可以“NOLOGGING”的 10 大操作(附一句话场景)

操作场景一句话
1. SQL*Loader direct path load海量文本一次性灌库,不想写日志
2. INSERT /*+ APPEND */巨大的 ETL 结果直接追加到分区表
3. CREATE TABLE … AS SELECT快速克隆一张大表做测试
4. CREATE INDEX给 10 亿行的表建索引,时间从小时变分钟
5. ALTER TABLE … MOVE PARTITION分区搬迁到新表空间,顺带压缩
6. ALTER TABLE … SPLIT PARTITION按日期拆分历史分区,瞬间完成
7. ALTER INDEX … SPLIT PARTITION局部分区索引“大卸八块”
8. ALTER INDEX … REBUILD索引碎片化,重建时省 redo
9. ALTER INDEX … REBUILD PARTITION只重建受损分区,其余不动
10. 对 NOCACHE NOLOGGING 的 LOB 做 DML存储图像、音频等大对象,且可接受丢失

NOLOGGING 的副作用

  • 介质恢复时会丢数据:上述操作产生的新区间被标记为 INVALID,一旦崩溃,数据无法通过 redo 恢复。
  • 必须备份:操作结束后立即对数据文件做一次备份(RMAN 或 OS 冷备),把“坑”填上。
  • 不是免死金牌:数据字典、空间分配等少量 redo 依旧会产生,只是业务数据不写日志。

实战

  1. 会话级启用 ALTER SESSION ENABLE PARALLEL DML;
    ALTER SESSION SET NOLOGGING;
  2. 语句级写法 CREATE INDEX idx_big ON big_table(col1, col2) NOLOGGING PARALLEL 8;
  3. 检查是否真正“静音” SELECT logging, degree FROM user_indexes WHERE index_name = ‘IDX_BIG’;

NOLOGGING 是 Oracle 给“大批量、可重现”的数据装载准备的加速器;用得好省时间,用不好省数据。先备份,再提速!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部