gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:08:49 26 4
gpt4 key购买 nike

我有一个以完全恢复模式运行的 SQL Server 数据库。我需要删除数据(大约 30-40 百万条记录),但我无法使数据库脱机,因为它一直在使用。我也无法将其切换到简单恢复模式,以防万一发生任何事情并且我们丢失了实时数据。当我尝试删除小块数据(大约 200 万行)时,事务日志变得非常大并导致进程变得非常慢。由于备份作业在晚上运行,我只有很少的时间。

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

有 3 个表有问题。事件、事件和目标。它的 Events 表中有数百万条记录,这就是需要时间删除的内容。所有这些都通过 Id 列具有必要的关系。

最佳答案

必须使用小块,否则您的事务日志会增加

将记录 30-40 百万次删除中的每一次。如果您创建一个新表并复制“保留”行,您仍然会有 50+ 百万记录行。简单恢复与完全恢复的事实无关紧要:每个删除/插入都被记录下来

如果日志在简单恢复中增加,那么我怀疑您是在事务中进行的。所以 30-40 百万次删除仍然被记录下来,即使是在简单的恢复中也是如此,因为它们可能都必须回滚。

对于简单恢复中没有事务的 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

过程:

  • 完整备份
  • 将恢复更改为简单
  • 删除
  • 将恢复更改为完整(或之前的状态)
  • 完整备份

如果你坚持在短时间内一次性删除 30+ 百万行,你没有太多其他选择......

关于sql-server-2008 - 在不影响性能的情况下删除 30-40 百万条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6211758/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com