我有一个在完全恢复中运行的SQL Server数据库。我需要删除数据(大约30到4千万条记录),但我不能将数据库脱机,因为它一直在使用。我也无法将其切换到简单恢复模式,如果发生任何事情,我们会丢失实时数据。当我尝试以小块(大约200万行)删除数据时,事务日志变得非常大并导致进程变得非常慢。由于夜间运行备份工作,我的时间范围很短。
有没有人对如何做到这一点有任何想法?我想过将表复制到另一个数据库(在简单恢复模式下),然后删除数据。这是个好主意吗?
有3个表格有问题。活动,活动和目标。它的Events表包含数百万条记录,这是需要时间删除的。所有这些都通过Id列具有必要的关系。
答案 0 :(得分:3)
你有使用小块,否则你的事务日志会增加
将记录30-40万次删除中的每一次。如果您创建一个新表并复制“保持”行,您仍将拥有超过500万条记录的行。简单与完全恢复的事实并不重要:记录每个删除/插入
如果日志在简单恢复中增加,那么我怀疑您是在事务中执行此操作。因此,即使在简单的恢复过程中,仍会记录3到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
过程:
如果你坚持在一个短窗口中一次删除超过3000万行,你没有很多其他选择......
答案 1 :(得分:1)
您使用什么标准来选择30-40百万行进行删除?如果它是相当简单的(例如“超过10天”),那么您可以使用SQL Server的表分区机制。在分区切换方面有一些记录良好的技术(参见下面的链接),以处理与您类似的用例。
pjjH
http://msdn.microsoft.com/en-us/library/ms191160%28v=sql.100%29.aspx