【问题标题】:Truncate or Drop and Create Table截断或删除并创建表
【发布时间】:2012-02-01 20:41:34
【问题描述】:

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

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

由于时间和它产生的额外事务日志条目,删除表的内容已经结束。

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

【问题讨论】:

标签: sql-server tsql truncate


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    截断表不会在事务日志中留下逐行条目 - 因此这两种解决方案都不会使您的日志过于混乱。如果是我,我会因为每次都必须删除和创建而截断。

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        删除表将破坏任何关联的对象(索引、触发器),并可能使过程或视图无效。我会使用 truncate,因为它不会破坏您的日志,并且不会导致 drop 和 create 的任何可能问题。

        【讨论】:

        • 谢谢,没有任何关联的索引或触发器,我只是担心事务日志变得太大。
        • 当我开始向我的表添加扩展属性时,我很难学到这一点,因为我的 t-sql 脚本使用了 drop-and-create,我不得不重新输入扩展属性并更改要截断的脚本。之后没有丢失扩展属性。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-25
        • 2021-12-11
        • 1970-01-01
        • 2015-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多