删除大部分巨大的表

问题描述:

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

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

它的工作原理,但它仍需要几个小时才能完成。有没有更快的方法来做到这一点?

+0

桌子上是否有触发器? – 2010-06-23 10:02:21

+0

不,没有触发器 – Stephane 2010-06-23 10:05:01

+0

我不明白你为什么需要复制后退步骤。难道你不能放弃表格并重命名临时表格吗? – 2010-06-23 10:07:54

根据意见,我的建议是简单地省略拷贝后退步骤,并通过重命名将包含记录的表提升为新的主表格。

它应该是相当简单的脚本列的索引/统计创建之前它被交换到被应用到新表。

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

虽然我不确定几点。

  1. 无论插入一个堆会更快,然后创建聚集索引。 (我想没有如果插入可以聚集索引的顺序进行)
  2. 无论是原来的表应该被丢弃之前(我猜是)
+0

我想我会首先创建聚集索引,但它应该无关紧要:无论如何,这是一个代理键,所以初始选择应该已经按照正确的顺序创建了表。不过,我会通过添加ORDER BY语句来确保。 为什么在删除表之前需要截断表格?就我所知,这两种操作都没有日志支持。 我会试试这个并报告结果。 – Stephane 2010-06-24 12:36:07

+0

@Stephane在这一点上我只是不确定。如果您以任何方式确认,我会感兴趣。 – 2010-06-24 12:37:32

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

编辑:(评论回复) 如果你正在维护所有表的视图,那么它不会变得复杂。复杂的部分是编码视图的丢弃和重新创建。

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

WAITFOR DELAY 'x' 

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

+0

数据已经存在,并且它已被应用程序使用。除此之外,它会使搜索剩余数据变得相当复杂。 – Stephane 2010-06-23 13:10:10

+0

这仍然会被记录下来。 OP正在设法避免日志记录的开销,使其更快,并没有提到任何有关最小化对并发事务的影响。我猜想可能没有。 – 2010-06-24 11:26:27

@uriDium截断 - 50000 采用分块分批将升级到表锁,除非您已通过alter table(sql2k8)或其他各种锁定技巧禁用锁升级。