我在 MSSQL 数据库中有一个表,其中包含分布在约 100 天内的 1 亿多条记录。我需要根据日期(表中的索引字段)清除部分数据。我尝试针对单个日期执行 DELETE FROM,但执行时间很长,导致服务器性能下降。有没有更好的方法来删除如此大量的记录?其中一些数据仍然是必需的,所以很遗憾我不能使用截断。
非常感谢尼克
答案1
我在按照以下流程执行类似任务时取得了最大的成功:
- 将数据复制到临时表中
- 截断原始表以清除所有数据
- 将临时表中的所有内容移回原始表
这样做的一个主要好处是,当您将数据放回原始表时,索引将被重建。
答案2
嗯,如果您使用的是 SQL Server 分区,比如基于日期列,那么您可能会切换出不再需要的分区。也许这是未来实施的一个考虑。
我认为您唯一的选择可能是以较小的批次删除数据,而不是一次性删除,以避免任何潜在的阻塞问题。
答案3
您可以删除表上的所有索引,从表中删除,然后重新创建索引。这可以加快速度,但这取决于未删除的记录的百分比。
答案4
另一个选项是将您想要的数据选入另一个表。您可以通过这种方式设置日期分区。
如果日期索引是聚集索引,则删除应该发生得更快,因为它们在磁盘上都很靠近。