旧文重发,原文发表于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(如果可以并行的话)是目前我能想到的最快速度了。