TRUNCATE TABLE是否会增长事务日志?

时间:2014-04-10 12:21:46

标签: sql sql-delete truncate transaction-log

我已经读过Sql中DELETE和TRUNCATE TABLE之间的区别之一是TRUNCATE操作无法回滚并且不会触发任何触发器(as written in this site for example):

问题: 这是否意味着当我TRUNcATE TABLE包含数百万条记录时,我不应该影响事务日志文件 - 事务日志文件在截断时不应该长大 - 我是否正确?

2 个答案:

答案 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。

  •   

来自:http://msdn.microsoft.com/en-us/library/ms177570.aspx

答案 1 :(得分:-1)

  

这是否意味着当我TRUNcATE TABLE包含数百万条记录时,我不应该影响事务日志文件 - 事务日志文件在截断时不应该长大 - 我是否正确?

嗯,你没有指定实际的服务器软件,但在所有情况下我都知道这是正确的。

DELETE有效地逐行工作,删除记录,触发任何适当的触发器,并向日志添加事务。

TRUNCATE只是一举删除所有数据,而不是显着影响事务日志(当然不足以允许回滚)并且不执行触发器。