截断或删除并创建表

19

我有一个位于SQL Server 2008 R2实例的表,我有一个定时进程每晚运行该表。该表在任何时间可能会有高达500K条记录。处理完这个表后,我需要将其中所有行都删除,因此我想知道以下哪种方法会产生最小的开销(即过多的事务日志条目):

  1. 截断表
  2. 删除并重新创建表

由于需要时间和额外的事务日志条目,删除表内容已经被排除。

共识似乎是截断,谢谢大家!


4
这里有一些关于日志量的比较。相比于DROP语句,使用TRUNCATE语句的日志量稍微少一些,因为DROP不仅会删除该对象的相关行,还会从系统表中删除这些行(这也会被记录在日志中)。 - Martin Smith
4个回答

17

TRUNCATE TABLE 是最好的选择。来自MSDN

不记录每个行删除操作,从表中删除所有行。

这意味着它不会使您的事务日志膨胀。删除并创建表不仅需要更复杂的 SQL,而且需要额外的权限。任何附加到表上的设置(触发器,GRANTDENY 等)也必须重新构建。


11

清空表格不会在事务日志中留下逐行条目 - 因此,两个解决方案都不会使您的日志过于混乱。如果是我,我会选择清空而不是每次都要删除和创建。


6
我会选择 TRUNCATE TABLE。当索引、触发器等被删除时,可能会产生额外的开销。此外,您将失去权限,还必须重新创建任何其他所需对象以及该表所需的所有内容。
另外,在 MDSN 中的 DROP TABLE 下面提到了一个小陷阱,如果在同一批中执行 DROP 和 CREATE TABLE,则可能会出现意外错误。
(注:保留原文中的链接和格式)

3
删除表将摧毁任何相关的对象(索引、触发器),可能会使存储过程或视图无效。建议使用截断,因为它不会导致日志爆炸并且不会造成删除和创建所可能引起的问题。

谢谢,没有关联的索引或触发器,我只是担心事务日志会变得太大。 - Mark Kram
当我开始向我的表添加扩展属性时,我通过吃亏的方式学到了这一点。由于我的t-sql脚本使用了删除和创建,我不得不重新输入扩展属性并更改脚本以进行截断。此后再也没有丢失扩展属性。 - user4864716

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接