[重发]如何真正NOLOGGING

旧文重发,原文发表于2007年2月1日

从前几天bigboar要做一个大表更新的项目引发的讨论,CTAS还是INSERT产生redo多。后来在fsm启发下又复习了遍Tom的结论。具体内容就不翻译了,转贴一下:
Table Mode    Insert Mode     ArchiveLog mode      result
———–   ————-   —————–    ———-
LOGGING       APPEND          ARCHIVE LOG          redo generated
NOLOGGING     APPEND          ARCHIVE LOG          no redo
LOGGING       no append       “”                   redo generated
NOLOGGING     no append       “”                   redo generated
LOGGING       APPEND          noarchive log mode   no redo
NOLOGGING     APPEND          noarchive log mode   no redo
LOGGING       no append       noarchive log mode   redo generated
NOLOGGING     no append       noarchive log mode   redo generated

简单来讲,就是表的模式和归档模式具有优先决定权,当表本身NOLOGGING时,指定了APPEND的hint才不产生redo(direct模式的sqlldr应该是一样的),另外就是非归档下则无论表状态只要APPEND总会生效。
其实也就是一个规律,具体的测试就不做了。呵呵。
BTW:在后来的讨论中其实还涉及到UNDO,CTAS产生UNDO方面还是有优势的,INSERT毕竟要记录rowid作为UNDO信息,而CTAS是DDL,立即提交,应该只是在涉及修改数据字典的地方产生UNDO而已。所以Tom在他的帖子里也是推荐用CTAS代替大量UPDATE。当然啦,CTAS也是有弱点的,毕竟表结构不能自定义,这样如果原表设计并不合理的时候就无法顺便改表结构了。
CTAS+PARALLEL(如果可以并行的话)是目前我能想到的最快速度了。