Mat*_*Mat 16
DML 与 DDL 的区别并不像它们的名字所暗示的那么清楚,所以有时事情会变得有点混乱。
Oracle在概念指南中明确归类TRUNCATE为 DDL,但DELETE归类为 DML。
据TRUNCATE我了解,加入 Oracle 的 DDL 阵营的要点是:
TRUNCATE可以改变存储参数(NEXT参数),这些是对象定义的一部分——在 DDL 阵营中。TRUNCATE执行隐式commit,并且不能回滚(闪回除外) - Oracle 中的大多数(全部?)DDL 操作都这样做,没有 DML 这样做。TRUNCATE不运行ON DELETE触发器的事实也将其与正常的 DML 操作区分开来(但一些直接路径 DML 操作也会跳过触发器,因此这不是一个明确的指标)。
同一文档指出DELETE生成 UNDO,但TRUNCATE不会生成,因此您的陈述在这方面是正确的。(请注意,TRUNCATE确实会生成一些,REDO以便在恢复/恢复时可以重播截断。)但是某些NOLOGGING操作也可以产生减少的 UNDO(不确定根本没有),因此在我看来,这也不是一个明确的指标。
所以我总结为:
truncate在提交且无法回滚的意义上不是“事务性的”,并且可以修改对象存储属性。所以它不是普通的 DML——Oracle 将其归类为 DDL。delete 是一个普通的 DML 语句。