我已经读过Sql中DELETE和TRUNCATE TABLE之间的区别之一是TRUNCATE操作无法回滚并且不会触发任何触发器(as written in this site for example):
问题: 这是否意味着当我TRUNcATE TABLE包含数百万条记录时,我不应该影响事务日志文件 - 事务日志文件在截断时不应该长大 - 我是否正确?
答案 0 :(得分:6)
在MS SQL Server(联机丛书)中
与DELETE语句相比,TRUNCATE TABLE具有以下优点:
使用较少的事务日志空间。
DELETE语句一次删除一行,并在事务日志中为每个已删除的行记录一个条目。 TRUNCATE TABLE通过释放用于存储表数据的数据页来删除数据,并仅在事务日志中记录页面解除分配。
通常使用较少的锁。
使用行锁执行DELETE语句时,表中的每一行都被锁定以进行删除。 TRUNCATE TABLE总是锁定表(包括模式(SCH-M)锁)和页面而不是每一行。
无一例外,表格中都留有零页。
执行DELETE语句后,表仍可包含空页。例如,如果没有至少一个独占(LCK_M_X)表锁,则无法释放堆中的空页。如果删除操作不使用表锁,则表(堆)将包含许多空页。对于索引,删除操作可以留下空页,尽管这些页面将通过后台清理过程快速释放。
TRUNCATE TABLE从表中删除所有行,但表结构及其列,约束,索引等仍保留。要删除除数据之外的表定义,请使用DROP TABLE语句。
如果表包含标识列,则该列的计数器将重置为为该列定义的种子值。如果未定义种子,则使用默认值1。要保留身份计数器,请改用DELETE。
答案 1 :(得分:-1)
这是否意味着当我TRUNcATE TABLE包含数百万条记录时,我不应该影响事务日志文件 - 事务日志文件在截断时不应该长大 - 我是否正确?
嗯,你没有指定实际的服务器软件,但在所有情况下我都知道这是正确的。
DELETE有效地逐行工作,删除记录,触发任何适当的触发器,并向日志添加事务。
TRUNCATE只是一举删除所有数据,而不是显着影响事务日志(当然不足以允许回滚)并且不执行触发器。