我有一个SQL Server数据库正在完全恢复中运行。我需要删除数据(大约3,000-4,000万条记录),但我不能使数据库脱机,因为它正在不断使用中。我也不能将它切换到简单恢复模式,以防发生任何事情,我们丢失了实时数据。当我尝试删除小块(大约200万行)中的数据时,事务日志变得非常大,导致过程变得非常慢。由于备份作业在夜间运行,我只有一个很小的时间范围。
有没有人对我该怎么做有什么想法?我考虑将表复制到另一个数据库中(在简单恢复模式下),然后删除数据。这是个好主意吗?
有3个表有问题。活动、事件和目标。它的Events表中有数百万条记录,而这正是要花时间删除的。所有这些都通过Id列具有必要的关系。
发布于 2011-06-02 16:25:21
您必须使用小块,否则您的事务日志将增加
3,000-4,000万次删除中的每一次都将被记录下来。如果您创建一个新表并复制“保留”行,仍然会有50+百万行记录。简单恢复与完整恢复并不重要:每次删除/插入都会被记录下来
如果日志在简单恢复中增加,那么我怀疑您是在事务中执行此操作。因此,即使在简单的恢复中,仍会记录3,000-4,000万次删除,因为它们可能都必须回滚。
对于40 x 100万次不带事务的删除,在更简单的恢复中,您可以使用CHECKPOINT来帮助整理日志
有关更多信息,请参阅Bulk DELETE on SQL Server 2008 (Is there anything like Bulk Copy (bcp) for delete data?)
而是类似于:
SELECT 'Starting' --sets @@ROWCOUNT
WHILE @@ROWCOUNT <> 0
BEGIN
CHECKPOINT
--Edit: must be last to set @@ROWCOUNT
DELETE TOP (1000000) MyTable WHERE ...
END进程:
recovery to full (或与以前一样)
如果你坚持在短时间内一下子删除30+百万行,你就没有太多的选择了……
发布于 2011-06-02 17:53:23
您使用什么标准来选择要删除的3,000-4,000万行?如果它是相当简单的东西(例如“超过10天”),那么您可以使用SQL Server的表分区机制。有一些记录良好的分区切换技术(参见下面的链接)可以处理与您类似的用例。
pjjH
http://msdn.microsoft.com/en-us/library/ms191160%28v=sql.100%29.aspx
https://stackoverflow.com/questions/6211758
复制相似问题