代码之家  ›  专栏  ›  技术社区  ›  Stephane

删除大表的大部分

  •  1
  • Stephane  · 技术社区  · 14 年前

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

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

    3 回复  |  直到 14 年前
        1
  •  1
  •   Martin Smith    14 年前

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

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

    1. 插入堆之后再创建聚集索引是否会更快(如果插入可以按聚集索引顺序进行,我猜不会)
        2
  •  1
  •   etliens    14 年前

    @尿苷——使用50000个批次进行分块 升级到表锁,除非通过altertable(sql2k8)或其他各种锁技巧禁用了锁升级。

        3
  •  0
  •   uriDium    14 年前

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

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

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

    WAITFOR DELAY 'x'