在不影响性能的情况下删除30-40万条记录

时间:2011-06-02 07:36:34

标签: sql-server-2008 large-data-volumes

我有一个在完全恢复中运行的SQL Server数据库。我需要删除数据(大约30到4千万条记录),但我不能将数据库脱机,因为它一直在使用。我也无法将其切换到简单恢复模式,如果发生任何事情,我们会丢失实时数据。当我尝试以小块(大约200万行)删除数据时,事务日志变得非常大并导致进程变得非常慢。由于夜间运行备份工作,我的时间范围很短。

有没有人对如何做到这一点有任何想法?我想过将表复制到另一个数据库(在简单恢复模式下),然后删除数据。这是个好主意吗?

有3个表格有问题。活动,活动和目标。它的Events表包含数百万条记录,这是需要时间删除的。所有这些都通过Id列具有必要的关系。

2 个答案:

答案 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