为什么要截断DDL语句?

Kan*_*Kan 8 sql oracle ddl

截断语句后表结构保持不变,只删除记录(使用自动提交).那么truncate是DDL语句的原因是什么?

小智 8

我在这里添加一些解释:默认情况下,截断表时,您不仅仅是删除行,而是隐含地告诉Oracle数据库还执行以下任务:

除了MINEXTENTS存储参数指定的行之外,释放已删除行使用的所有空间

将NEXT存储参数设置为截断过程从段中删除的最后一个范围的大小

因此,它通过重置水高标记来更改存储定义并更改表的结构.

它也不能是DML,对吗?Where子句不能指定或附带DDL语句.如果truncate是DML语句,则Oracle允许我们将truncate与where子句一起使用.
注意:SQL中的WHERE子句指定SQL数据操作语言(DML)语句应仅影响满足指定条件的行.

  • 另外:没有执行触发器(删除之前/之后),并且库缓存中的缓存执行计划也会失效. (2认同)

Mur*_*nik 7

TRUNCATE重置表格的高水位线,有效地消除了之前存在的所有行.将其作为DDL语句处理允许它超快,因为它允许它在不保留DML语句之类的撤销(回滚)信息的情况下运行.


kmw*_*dra 7

一个简单实用的解释可以是:

截断通过更改数据定义来重新初始化身份,因此它是DDL,而 Delete 仅从表中删除记录,并且不会对其定义进行任何更改,这就是为什么它是DML

比如创建一个表并插入一些初始记录。

创建的表插入了一些记录

删除所有记录(没有 where 子句)并再次插入记录。身份不会重新初始化。

删除所有记录并再次插入

现在截断表并重新插入记录。

截断表并重新插入记录

  • 问题是关于 Oracle,而不是 SQL Server (3认同)