为什么是truncate DDL?

Rav*_*avi 15 oracle delete truncate ddl

我有一个面试问题,这是我面试时问的。我回答了这个问题,但面试官对我的回答并不那么信服。所以,有人请用我的理解纠正我吗?

问:为什么 Truncate 是 DDL 而 Delete 是 DML?两者都做几乎相同的工作(删除行)

答。当我们使用 Truncate 时,我们正在取消分配由数据分配的整个空间,而不保存到撤消表空间中。但是,在删除的情况下,我们将所有数据放入撤消表空间,然后删除所有数据。

请,如果有人知道上述最佳答案,请解释。

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 语句。