Sql 我应该在删除表之前截断表以避免日志记录开销吗?

Sql 我应该在删除表之前截断表以避免日志记录开销吗?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我知道使用TRUNCATE是一种记录最少的操作,在DROP记录删除操作时,不会记录每个记录的删除 所以,可以安全地假设,如果我想摆脱一个相对较大的表,并且我想以尽可能少的日志开销尽快实现这一点,我应该在删除表之前截断表?在RECOVERY SIMPLE中执行此操作是否有任何区别 我应该注意到,这需要以自动化的方式(在预先编写的脚本中)进行,因为这将部署到客户端数据库,在客户端数据库中,停机和日志文件增长都可能是一个问题。根据我的经验,truncate比drop快得多,特别是对于大型数据集。而tr

我知道使用
TRUNCATE
是一种记录最少的操作,在
DROP
记录删除操作时,不会记录每个记录的删除

所以,可以安全地假设,如果我想摆脱一个相对较大的表,并且我想以尽可能少的日志开销尽快实现这一点,我应该在删除表之前
截断表
?在
RECOVERY SIMPLE
中执行此操作是否有任何区别


我应该注意到,这需要以自动化的方式(在预先编写的脚本中)进行,因为这将部署到客户端数据库,在客户端数据库中,停机和日志文件增长都可能是一个问题。

根据我的经验,truncate比drop快得多,特别是对于大型数据集。

而truncate不记录单个行,它不记录页面/数据块的日志。这就是为什么可以回滚截断(这不是很多人知道的)。我的猜测是,如果你只是截断,那么下降实际上会比下降本身慢。如果您在两者之间提交,可能不会,但这也取决于日志活动、恢复模型、何时到达检查点等

为什么速度在这里很重要?如果您要删除该表,则用户不会使用该表


你为什么不测试一下呢?除非有人对此进行了广泛的研究,涵盖了几个不同的变量,否则我怀疑你不会得到比准知识猜测多得多的东西。

我的记忆是,如果恢复设置是
简单的
,那么这个问题就没有意义了。那么,这是否意味着在使用简单恢复模型时,删除表被认为是记录最少的?我还没有看到任何明确的答案。即使是在简单的恢复中,只要你还在同一笔交易中,你也可以回滚一次下跌。SQL Server中没有多少真正的“最小日志记录”操作。@Aaron-通常大多数“最小日志记录”操作都记录页面范围和元数据更改,而不是行级别的更改,对吗?是的,我就是这样理解的,但不同的人可能有不同的解释。速度之所以是一个因素,是因为这是生产数据库升级过程的一部分,需要将停机时间保持在最低限度。老实说,日志文件增长可能是一个更大的问题。为什么不在升级过程后删除该表呢?它不需要在升级完成之前就消失,只需要用不同版本的表替换它(我假设)。我会说将它转移到另一个模式或重命名它,然后你可以在用户不等待的时候删除它。Aaron,你说的表被替换是正确的。它是“大规模”数据迁移项目的一部分。但问题是,由于部署模型的工作方式,必须以自动化方式运行。在这种情况下,我真的没有选择手动执行任何操作。@OMG-太棒了。它只需要包含在一个事务中,但是您可以
回滚
a
截断
@Justin-我认为除非我们讨论的是100 GB大小的表,否则您可能不会注意到差异。