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将从它停止的位置继续递增.参考:本罗宾逊的回答.
TRUNCATE TABLE不记录交易。这意味着对于大型表来说速度快如闪电。缺点是您无法撤消该操作。
DELETE FROM记录事务日志中正在删除的每一行,因此该操作需要一段时间并导致事务日志急剧增长。好处是您可以根据需要撤消操作。