2014-01-23 31 views
2

这可能是一个非常基本的问题,但您如何事先确定大型操作是否最终会使用数据库日志或tempdb空间?SQL Server - Tempdb与数据库日志的使用

例如,我做过的一个大型插入/更新操作使用了数据库日志,因此我们需要使用SSIS &批量操作,因此空间不会用完,因为脚本中的所有更改都必须一次部署。

所以现在我正在处理一个大规模的删除操作,这将会把日志填满10次。因此,我创建了一个脚本来检查数据库日志文件使用的空间,并以较小的批次删除行,并且一旦日志文件足够大,脚本就会中止,然后在第二天从该点继续(允许正常使用情况可以继续,直到下一次备份,而不会有日志空间不足的风险)。

现在,而不是填写日志,后者查询开始填写tempdb。 Tempdb数据文件,而不是日志文件,具体。所以我认为这是一个巨大的漏洞,我理解这两个应该是。 :)

感谢您的任何建议!

编辑:

为了澄清,这里的问题是,为什么第一个例子中使用的数据库的日志,而后者使用tempdb的数据文件,存储的变化?一般来说,通过哪种逻辑将DML操作存储到tempdb或log?正常情况下,日志应该存储所有数据库更改,而tempdb仅用于在操作期间显式请求(即临时对象)或服务器耗尽内存时存储处理的数据,对吗?

+0

你的表是否有索引?在任何批量操作之前,您应该删除索引,然后在批量操作后重新创建。 – vasin1987

+0

嘿,编辑了这个问题。批量操作工作正常,在这里没有关注的索引。目前的问题是无法用批量操作处理的删除操作,由于某种原因,它正在使用tempdb空间而不是db log,因为我认为它应该。 :) – Kahn

回答

2

实际上,在从表格中删除记录时幕后会发生很多事情。这MSDN Blog link可能有助于说明为什么tempdb在尝试和删除时填满了。无论采用哪种方式,删除操作都会填满事务日志,这听起来像是临时数据库在到达事务日志记录之前已经填满了。

我不完全确定您的要求是什么,但以下链接可能对您的事务日志记录问题有点启发。这些都是为SQL Server 2008 R2设置的,但您可以切换到正在运行的任何版本。

Recovery Model Overiew

Considerations for Switching from the Simple Recovery Model

Considerations for Switching from the Full or Bulk-Logged Recovery Model

您还可以截断表的选项,但是这取决于几件事情。如果您不需要记录操作,并且正在删除表中的所有记录,则可以截断。如果您正在进行某种条件删除,但是您删除的内容比您保留的要多,则可以随时将所有要保留的记录插入另一个“暂存”表中,然后截断原始内容。然后,您可以将记录重新插入登台表中。但是,只有当您在该表上没有外键关系时才有效。

+0

感谢您的评论!是的,截断在这里不是一个选择。该表非常大,我们只会删除它的30%。看起来我需要做的是包含tempdb,并在删除数据时检查它们。 – Kahn

相关问题