pen*_*ake 3 sql truncate transaction-log sql-delete
我已经读过Sql中DELETE和TRUNCATE TABLE之间的区别之一是无法回滚 TRUNCATE操作并且不会触发任何触发器(例如,在此站点中编写):
问题:这是否意味着当我TRUNcATE TABLE包含数百万条记录时,我不应该影响事务日志文件 - 事务日志文件在截断时不应该长大 - 我是否正确?
在MS SQL Server(联机丛书)
与DELETE语句相比,TRUNCATE TABLE具有以下优点:
使用较少的事务日志空间.
DELETE语句一次删除一行,并在事务日志中为每个已删除的行记录一个条目.TRUNCATE TABLE通过释放用于存储表数据的数据页来删除数据,并仅在事务日志中记录页面解除分配.
通常使用较少的锁.
使用行锁执行DELETE语句时,表中的每一行都被锁定以进行删除.TRUNCATE TABLE总是锁定表(包括模式(SCH-M)锁)和页面,但不是每行.
毫无例外,表格中留有零页面.
执行DELETE语句后,表仍可以包含空页.例如,如果没有至少一个独占(LCK_M_X)表锁,则无法释放堆中的空页.如果删除操作不使用表锁,则表(堆)将包含许多空页.对于索引,删除操作可以留下空页,尽管这些页面将通过后台清理过程快速释放.
TRUNCATE TABLE从表中删除所有行,但表结构及其列,约束,索引等仍保留.要删除除数据之外的表定义,请使用DROP TABLE语句.
如果表包含标识列,则该列的计数器将重置为为该列定义的种子值.如果未定义种子,则使用默认值1.要保留身份计数器,请改用DELETE.
来自:http://msdn.microsoft.com/en-us/library/ms177570.aspx
D S*_*ley -2
这是否意味着当我截断包含数百万条记录的表时,我不应该影响事务日志文件 - 即事务日志文件不应在截断时增大 - 我是否正确?
好吧,您没有指定实际的服务器软件,但在所有情况下我都知道这是正确的。
DELETE 有效地逐行工作,删除记录,触发任何适当的触发器,并将事务添加到日志中。
TRUNCATE 只是一次性删除所有数据,不会显着影响事务日志(当然不足以允许回滚)并且不会执行触发器。