首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不影响性能的情况下删除3000-4000万条记录

在不影响性能的情况下删除3000-4000万条记录
EN

Stack Overflow用户
提问于 2011-06-02 15:36:34
回答 2查看 2.9K关注 0票数 3

我有一个SQL Server数据库正在完全恢复中运行。我需要删除数据(大约3,000-4,000万条记录),但我不能使数据库脱机,因为它正在不断使用中。我也不能将它切换到简单恢复模式,以防发生任何事情,我们丢失了实时数据。当我尝试删除小块(大约200万行)中的数据时,事务日志变得非常大,导致过程变得非常慢。由于备份作业在夜间运行,我只有一个很小的时间范围。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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?)

而是类似于:

代码语言:javascript
复制
SELECT 'Starting' --sets @@ROWCOUNT
WHILE @@ROWCOUNT <> 0
BEGIN
    CHECKPOINT
    --Edit: must be last to set @@ROWCOUNT
    DELETE TOP (1000000) MyTable WHERE ...
END

进程:

  • full backup
  • change recovery to

recovery to full (或与以前一样)

  • full backup

如果你坚持在短时间内一下子删除30+百万行,你就没有太多的选择了……

票数 3
EN

Stack Overflow用户

发布于 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6211758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档