我有一个位于SQL Server 2008 R2实例的表,我有一个定时进程每晚运行该表。该表在任何时间可能会有高达500K条记录。处理完这个表后,我需要将其中所有行都删除,因此我想知道以下哪种方法会产生最小的开销(即过多的事务日志条目):
- 截断表
- 删除并重新创建表
由于需要时间和额外的事务日志条目,删除表内容已经被排除。
共识似乎是截断,谢谢大家!
我有一个位于SQL Server 2008 R2实例的表,我有一个定时进程每晚运行该表。该表在任何时间可能会有高达500K条记录。处理完这个表后,我需要将其中所有行都删除,因此我想知道以下哪种方法会产生最小的开销(即过多的事务日志条目):
由于需要时间和额外的事务日志条目,删除表内容已经被排除。
共识似乎是截断,谢谢大家!
TRUNCATE TABLE
是最好的选择。来自MSDN:
不记录每个行删除操作,从表中删除所有行。
这意味着它不会使您的事务日志膨胀。删除并创建表不仅需要更复杂的 SQL,而且需要额外的权限。任何附加到表上的设置(触发器,GRANT
或 DENY
等)也必须重新构建。
清空表格不会在事务日志中留下逐行条目 - 因此,两个解决方案都不会使您的日志过于混乱。如果是我,我会选择清空而不是每次都要删除和创建。
DROP
语句,使用TRUNCATE
语句的日志量稍微少一些,因为DROP
不仅会删除该对象的相关行,还会从系统表中删除这些行(这也会被记录在日志中)。 - Martin Smith