我有一张非常大的桌子(超过3亿条记录)需要清理。其中大约80%需要删除。数据库软件是MS SQL 2005.表上有几个索引和统计信息,但没有外部关系。
到目前为止,我提出的最佳解决方案是将数据库置于“简单”恢复模式,将我要保留的所有记录复制到临时表,截断原始表,将标识插入设置为on和从临时表中复制数据。
虽然有效,但仍需要几个小时才能完成。有更快的方法吗?
答案 0 :(得分:1)
根据评论,我的建议是简单地省略复制步骤,并通过重命名将包含记录的表提升为新的主表。
在交换之前编写要应用于新表的索引/统计信息创建的脚本应该非常简单。
应在非聚簇索引之前创建聚簇索引。
但我不确定的几点。
答案 1 :(得分:1)
@uriDium - 除非您通过alter table(sql2k8)或其他各种锁定技巧禁用了锁升级,否则使用50,000个批次的分块将升级到表锁定。
答案 2 :(得分:0)
我不确定您的数据结构是什么。什么时候有资格删除?如果它是基于日期的纯粹ID,那么您可以为每天创建一个新表,将新数据插入新表中,当涉及到清理时,只需删除所需的表。然后,对于任何选择构建所有表的视图。只是一个想法。
编辑:(回应评论) 如果您要维护所有表的视图,那么它根本不会复杂。复杂的部分是编写视图的删除和重新创建。
我假设您不希望在删除过程中数据被锁定太多。为什么不对删除操作进行分块。创建了一个SP,它将以块的形式删除数据,一次删除50 000行。这应该确保SQL Server保持行锁而不是表锁。使用
WAITFOR DELAY 'x'
在你的while循环中,这样你就可以给其他查询一些喘息的空间。你的问题是老年计算机科学,空间与时间。