截断或删除并创建表

时间:2012-02-01 20:41:34

标签: sql-server tsql truncate

我在SQL Server 2008 R2实例中有这个表,我有一个计划的进程,每晚运行它。该表在任何时候都可以有多达500K的记录。处理完这个表之后,我需要从中删除所有行,所以我想知道以下哪种方法会产生最少的开销(即过多的事务日志条目):

  1. 截断表
  2. 删除并重新创建表格
  3. 由于时间和额外的事务日志条目而删除表的内容。

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

4 个答案:

答案 0 :(得分:14)

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

  

从表中删除所有行而不记录单个行   删除。

这意味着它不会破坏您的事务日志。删除和创建表不仅需要更复杂的SQL,还需要其他权限。附加到表格的任何设置(触发器,GRANTDENY等)也必须重新构建。

答案 1 :(得分:8)

截断表不会在事务日志中留下逐行条目 - 因此这两种解决方案都不会使日志过于混乱。如果是我,那我就不得不每次都放弃创建。

答案 2 :(得分:5)

我会选择TRUNCATE TABLE。当索引,触发器等被丢弃时,您可能会有开销。此外,您将失去权限,这些权限也必须与该表所需的任何其他必需对象一起重新创建。

同样在MDSN下面的DROP TABLE,如果你在同一批次中执行DROP和CREATE TABLE,它会提到一点点问题

  

不应在同一个表上执行DROP TABLE和CREATE TABLE   在同一批次。否则可能会发生意外错误。

答案 3 :(得分:2)

删除表将破坏任何关联的对象(索引,触发器),并可能使过程或视图无效。我会选择截断,因为它不会炸毁你的日志,并且不会导致丢弃和创建的任何问题。