删除大部分巨大的表格

时间:2010-06-23 09:53:39

标签: sql-server-2005

我有一张非常大的桌子(超过3亿条记录)需要清理。其中大约80%需要删除。数据库软件是MS SQL 2005.表上有几个索引和统计信息,但没有外部关系。

到目前为止,我提出的最佳解决方案是将数据库置于“简单”恢复模式,将我要保留的所有记录复制到临时表,截断原始表,将标识插入设置为on和从临时表中复制数据。

虽然有效,但仍需要几个小时才能完成。有更快的方法吗?

3 个答案:

答案 0 :(得分:1)

根据评论,我的建议是简单地省略复制步骤,并通过重命名将包含记录的表提升为新的主表。

在交换之前编写要应用于新表的索引/统计信息创建的脚本应该非常简单。

应在非聚簇索引之前创建聚簇索引。

但我不确定的几点。

  1. 是否可以更快地插入堆中,然后再创建聚簇索引。 (我猜如果插入可以按聚簇索引顺序完成)
  2. 原始表是否应在被删除之前被截断(我猜是的)

答案 1 :(得分:1)

@uriDium - 除非您通过alter table(sql2k8)或其他各种锁定技巧禁用了锁升级,否则使用50,000个批次的分块将升级到表锁定。

答案 2 :(得分:0)

我不确定您的数据结构是什么。什么时候有资格删除?如果它是基于日期的纯粹ID,那么您可以为每天创建一个新表,将新数据插入新表中,当涉及到清理时,只需删除所需的表。然后,对于任何选择构建所有表的视图。只是一个想法。

编辑:(回应评论) 如果您要维护所有表的视图,那么它根本不会复杂。复杂的部分是编写视图的删除和重新创建。

我假设您不希望在删除过程中数据被锁定太多。为什么不对删除操作进行分块。创建了一个SP,它将以块的形式删除数据,一次删除50 000行。这应该确保SQL Server保持行锁而不是表锁。使用

WAITFOR DELAY 'x'

在你的while循环中,这样你就可以给其他查询一些喘息的空间。你的问题是老年计算机科学,空间与时间。