Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 删除大部分大型表_Sql Server 2005 - Fatal编程技术网

Sql server 2005 删除大部分大型表

Sql server 2005 删除大部分大型表,sql-server-2005,Sql Server 2005,我有一个非常大的表(超过3亿条记录),需要清理。其中大约80%需要删除。数据库软件是MS SQL 2005。表中有几个索引和统计信息,但没有外部关系 到目前为止,我提出的最好的解决方案是将数据库置于“简单”恢复模式,将我想要保留的所有记录复制到一个临时表中,截断原始表,将identity insert设置为on,然后从临时表中复制回数据 它可以工作,但仍然需要几个小时才能完成。有没有更快的方法呢?我不确定您的数据结构是什么。行何时可以删除?如果它是一个纯粹基于日期的ID,那么您可以为每天创建一个

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

到目前为止,我提出的最好的解决方案是将数据库置于“简单”恢复模式,将我想要保留的所有记录复制到一个临时表中,截断原始表,将identity insert设置为on,然后从临时表中复制回数据


它可以工作,但仍然需要几个小时才能完成。有没有更快的方法呢?

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

编辑:(回应评论) 如果要在所有表上维护一个视图,那么不,它一点也不复杂。复杂的部分是对视图的删除和重新创建进行编码

我假设您不希望在删除过程中过多地锁定数据。为什么不分块删除操作呢。创建了一个SP,该SP将分块删除数据,每次删除50000行。这应该确保SQL Server保留行锁而不是表锁。使用

WAITFOR DELAY 'x'

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

根据评论,我的建议是省去“复制回”步骤,通过重命名包含要保留的记录的表,将其升级为新的主表

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

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

但有几点我不确定

  • 插入堆之后再创建聚集索引是否会更快。(如果可以按聚集索引顺序进行插入,我想不会)
  • 是否应该在删除原始表之前将其截断(我想是的)

  • @uriDium——使用50000个批次的分块将升级为表锁,除非您已通过alter table(sql2k8)或其他各种锁定技巧禁用了锁升级。

    表上有任何触发器吗?我不明白您为什么需要“复制回”步骤。你不能直接删除表并重命名临时表吗?我可以,但是我必须重新创建所有索引和统计数据。@Stephane这样做有什么问题吗?(显然在重命名步骤之前)问得好。部分原因是该表非常宽(约180个字段),并且包含大量索引和统计信息。删除它们并重新创建它们是一个相当长的过程,需要相当长的脚本。不过,我看看能不能快一点。也许你应该把它作为一个可能的答案提交给我,这样我就可以投票支持它,如果它能让事情变得更快,我就接受它;)数据已经存在,并且已被应用程序使用。此外,搜索剩余数据会变得相当复杂,但仍会被记录下来。OP试图避免日志记录带来的开销,使其更快,并且没有提到任何关于最小化对并发事务的影响的内容。我想可能没有。我想我会先创建聚集索引,但这并不重要:反正它是一个代理键,所以执行初始选择应该已经按照正确的顺序创建了表。不过,我会添加一个orderby语句来确保。为什么必须在删除表之前截断它?据我所知,这两项操作都没有日志支持。我会试试这个并报告结果。@Stephane我只是不确定这一点。如果你能确认一下,我会很感兴趣的。