Sql server 2005 删除大部分大型表
我有一个非常大的表(超过3亿条记录),需要清理。其中大约80%需要删除。数据库软件是MS SQL 2005。表中有几个索引和统计信息,但没有外部关系 到目前为止,我提出的最好的解决方案是将数据库置于“简单”恢复模式,将我想要保留的所有记录复制到一个临时表中,截断原始表,将identity insert设置为on,然后从临时表中复制回数据Sql server 2005 删除大部分大型表,sql-server-2005,Sql Server 2005,我有一个非常大的表(超过3亿条记录),需要清理。其中大约80%需要删除。数据库软件是MS SQL 2005。表中有几个索引和统计信息,但没有外部关系 到目前为止,我提出的最好的解决方案是将数据库置于“简单”恢复模式,将我想要保留的所有记录复制到一个临时表中,截断原始表,将identity insert设置为on,然后从临时表中复制回数据 它可以工作,但仍然需要几个小时才能完成。有没有更快的方法呢?我不确定您的数据结构是什么。行何时可以删除?如果它是一个纯粹基于日期的ID,那么您可以为每天创建一个
它可以工作,但仍然需要几个小时才能完成。有没有更快的方法呢?我不确定您的数据结构是什么。行何时可以删除?如果它是一个纯粹基于日期的ID,那么您可以为每天创建一个新表,将新数据插入新表中,当涉及到清理时,只需删除所需的表。然后,对于任何选择,在所有表上构造一个视图。只是个主意 编辑:(回应评论) 如果要在所有表上维护一个视图,那么不,它一点也不复杂。复杂的部分是对视图的删除和重新创建进行编码 我假设您不希望在删除过程中过多地锁定数据。为什么不分块删除操作呢。创建了一个SP,该SP将分块删除数据,每次删除50000行。这应该确保SQL Server保留行锁而不是表锁。使用
WAITFOR DELAY 'x'
在while循环中,这样您就可以给其他查询一点喘息的空间。你的问题是老年计算机科学,空间与时间 根据评论,我的建议是省去“复制回”步骤,通过重命名包含要保留的记录的表,将其升级为新的主表 在插入新表之前,编写要应用于新表的索引/统计信息创建脚本应该非常简单 聚集索引应在非聚集索引之前创建 但有几点我不确定
@uriDium——使用50000个批次的分块将升级为表锁,除非您已通过alter table(sql2k8)或其他各种锁定技巧禁用了锁升级。表上有任何触发器吗?我不明白您为什么需要“复制回”步骤。你不能直接删除表并重命名临时表吗?我可以,但是我必须重新创建所有索引和统计数据。@Stephane这样做有什么问题吗?(显然在重命名步骤之前)问得好。部分原因是该表非常宽(约180个字段),并且包含大量索引和统计信息。删除它们并重新创建它们是一个相当长的过程,需要相当长的脚本。不过,我看看能不能快一点。也许你应该把它作为一个可能的答案提交给我,这样我就可以投票支持它,如果它能让事情变得更快,我就接受它;)数据已经存在,并且已被应用程序使用。此外,搜索剩余数据会变得相当复杂,但仍会被记录下来。OP试图避免日志记录带来的开销,使其更快,并且没有提到任何关于最小化对并发事务的影响的内容。我想可能没有。我想我会先创建聚集索引,但这并不重要:反正它是一个代理键,所以执行初始选择应该已经按照正确的顺序创建了表。不过,我会添加一个orderby语句来确保。为什么必须在删除表之前截断它?据我所知,这两项操作都没有日志支持。我会试试这个并报告结果。@Stephane我只是不确定这一点。如果你能确认一下,我会很感兴趣的。