我在SQL Server 2008 R2实例中有这个表,我有一个计划的进程,每晚运行它。该表在任何时候都可以有多达500K的记录。处理完这个表之后,我需要从中删除所有行,所以我想知道以下哪种方法会产生最少的开销(即过多的事务日志条目):
由于时间和额外的事务日志条目而删除表的内容。
共识似乎是截断,谢谢大家!
答案 0 :(得分:14)
TRUNCATE TABLE
是您最好的选择。来自MSDN:
从表中删除所有行而不记录单个行 删除。
这意味着它不会破坏您的事务日志。删除和创建表不仅需要更复杂的SQL,还需要其他权限。附加到表格的任何设置(触发器,GRANT
或DENY
等)也必须重新构建。
答案 1 :(得分:8)
截断表不会在事务日志中留下逐行条目 - 因此这两种解决方案都不会使日志过于混乱。如果是我,那我就不得不每次都放弃创建。
答案 2 :(得分:5)
我会选择TRUNCATE TABLE。当索引,触发器等被丢弃时,您可能会有开销。此外,您将失去权限,这些权限也必须与该表所需的任何其他必需对象一起重新创建。
同样在MDSN下面的DROP TABLE,如果你在同一批次中执行DROP和CREATE TABLE,它会提到一点点问题
不应在同一个表上执行DROP TABLE和CREATE TABLE 在同一批次。否则可能会发生意外错误。
答案 3 :(得分:2)
删除表将破坏任何关联的对象(索引,触发器),并可能使过程或视图无效。我会选择截断,因为它不会炸毁你的日志,并且不会导致丢弃和创建的任何问题。