为什么截断DDL?


15

我有一个面试问题,在面试过程中被问到。我回答了这个问题,但是面试官对我的回答并不那么确信。那么,有人请以我的理解纠正我吗?

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

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

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


评论不作进一步讨论;此对话已转移至聊天
保罗·怀特9

Answers:


14

DML与DDL的区别并不像其名称所暗示的那么清晰,因此有时会变得有些混乱。

Oracle 在《概念指南》中明确归类TRUNCATE为DDL,但DELETE归类为DML。

TRUNCATE我了解,DDL阵营在Oracle上的要点是:

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

创建表时,可以指定诸如进入表空间的大小,初始大小,下一个扩展数据块大小等内容。这些是存储属性。是的,它们是表(或索引或​​分区)元数据的一部分。

请注意,SQL标准在“数据操作”一章中列出了TRUNCATE以及INSERT,DELETE和UPDATE。
a_horse_with_no_name

2

我认为这truncatedrop,相似altercreate因为它们都在表上工作,即它们都是表级命令。而“删除”类似insertselectupdate作为一个行的所有工作,即他们都是行级别的命令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.