TRUNCATE与DELETE FROM的优缺点

Jim*_*m B 59 t-sql sql-server truncate sql-server-2008 sql-delete

有人可以让我快速概述使用以下两个陈述的利弊:

TRUNCATE TABLE dbo.MyTable
Run Code Online (Sandbox Code Playgroud)

VS

DELETE FROM dbo.MyTable
Run Code Online (Sandbox Code Playgroud)

看来和完成所有事情似乎他们都做了同样的事情; 但这两者之间是否存在差异?

dcp*_*dcp 83

TRUNCATE不生成任何回滚数据,这使它快速闪电.它只是释放表使用的数据页.

但是,如果您处于事务中并希望能够"撤消"此删除,则需要使用DELETE FROM,这样才能回滚.

编辑: 请注意上面的SQL Server不正确(但它适用于Oracle).在SQL Server中,如果您在事务内并且尚未提交事务,则可以回滚截断操作.从SQL Server的角度来看,之间的一个主要区别DELETE FROM truncate为这样:"DELETE语句删除行一次一个,并记录在事务日志中删除的每一行的条目截断表被重新分配数据页删除数据.用于存储表数据并仅记录事务日志中的页面解除分配."

换句话说,在TRUNCATE期间记录的次数较少,因为只有页面解除分配记录在事务日志中,而每次删除行都会记录删除行.这是TRUNCATE快速闪电的原因之一.

另请注意,MSDN链接中不能截断由外键约束引用的表,参与索引视图或使用事务复制或合并复制发布.

编辑2: 另一个关键点是TRUNCATE TABLE会将您的身份重置为初始种子,而DELETE FROM将从它停止的位置继续递增.参考:本罗宾逊的回答.

  • @Yossarian - 根据MSDN:"你不能在FOREIGN KEY约束引用的表上使用TRUNCATE TABLE;而是使用没有WHERE子句的DELETE语句".http://msdn.microsoft.com/en-us/library/aa260621%28SQL.80%29.aspx (15认同)
  • `TRUNCATE`也可能会破坏一致性(=不检查外键,也不会触发触发器) (6认同)
  • truncate也可以回滚.http://sqlblog.com/blogs/denis_gobo/archive/2007/06/13/1458.aspx (4认同)

Ben*_*son 46

在其他答案中没有提到的另一个关键点是TRUNCATE TABLE将你的身份重置为初始种子,而DELETE FROM将从它停止的地方继续递增.


Kyl*_*ale 8

与安全性角度的另一个区别是TRUNCATE需要对表具有ALTER权限,而DELETE仅需要(滚动)对该表的DELETE权限.


Jus*_*ner 6

TRUNCATE TABLE不记录交易。这意味着对于大型表来说速度快如闪电。缺点是您无法撤消该操作。

DELETE FROM记录事务日志中正在删除的每一行,因此该操作需要一段时间并导致事务日志急剧增长。好处是您可以根据需要撤消操作。

  • TRUNCATE 会被记录下来,并且可以像 DELETE 一样通过使用 ROLLBACK 或 RESTORE 来撤消。 (2认同)