2012-02-01 119 views
15

我有一个SQL Server 2008 R2实例中的此表,我有一个夜间运行的计划进程。该表可以在任何时候向上至500K记录。处理此表后,我需要从它删除所有行,所以我想知道它下面的方法将产生最少的开销(即过多的事务日志条目):截断或删除并创建表

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

删除表中的内容是由于时间和额外的事务日志条目而产生的。

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

+4

[这里记录的数量之间的一些比较](http://dba.stackexchange.com/a/7685/3690)。 'TRUNCATE'的日志记录比'DROP'少一点,因为删除也会导致该对象的关联行从系统表中删除(同时也记录下来) – 2012-02-01 20:47:30

回答

8

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

13

TRUNCATE TABLE是你最好的选择。 From MSDN

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

所以这意味着它不会膨胀你的交易记录。删除和创建表格不仅需要更复杂的SQL,还需要额外的权限。附加到表格的任何设置(触发器,GRANTDENY等)也将不得不重新构建。

5

我会去TRUNCATE TABLE。当索引,触发器等被丢弃时,您可能会有开销。另外,您将失去必须重新创建的权限以及该表所需的任何其他必需对象。

而且在它下面MDSN DROP TABLE如果执行DROP,并在同一批次CREATE TABLE

DROP TABLE和CREATE TABLE提到一点疑难杂症不应该在同一个表 在同一批次中执行。否则可能会发生意外错误。

2

删除表将销毁任何关联的对象(索引,触发器),并可能使过程或视图无效。我会去truncate,因为它不会炸毁你的日志,并导致没有任何可能的问题下降和创建。

+0

谢谢,没有任何关联的索引或触发器,我只是担心交易日志变得太大。 – 2012-02-01 20:54:01

+0

当我开始向表中添加扩展属性时,以及由于我的t-sql脚本使用了drop-and-create,我不得不重新输入扩展属性并将脚本更改为截断。之后没有丢失扩展属性。 – 2016-04-29 21:58:19