提高 SQL Server 的删除速度

16 performance sql-server query-performance

我们拥有庞大的生产数据库,其大小约为 300GB。有什么方法可以提高删除查询的性能?现在删除速度在每分钟1-10k之间,对我们来说非常慢。

Aar*_*and 26

如果您尝试在单个语句中删除大量行,那么您很可能正在等待日志活动。这样你就可以:

  1. 确保您的日志有足够的大小,以便增长事件不会减慢您的速度。默认情况下,您的日志可能从 1MB 开始,增长 10%。增长事件是昂贵的,如果您记录甚至 10 GB 的删除,这不仅会破坏现在而且将来的性能(由于这对 VLF 的影响)。
  2. 如果要删除整个表,请使用TRUNCATEDROP/ CREATE
  3. 如果要删除大部分表,使用SELECT INTO将要保留的数据放入另一个表中,然后TRUNCATE,然后将小部分移回。(或者只是删除旧表,重命名新表,然后重新应用约束/权限等)
  4. 通过分块而不是一次删除所有数据,首先将日志记录的影响降至最低。请参阅这篇文章。你也可以考虑暂时切换到简单恢复,这样你只需要CHECKPOINT清除日志而不是做日志备份,但是你需要确保将它设置回来并重新启动一个新的完整备份来重新启动日志链.

  • @Tony 删除索引也必须被记录(就像创建它一样),所以这可能只是您想要支付该费用的时间的问题。没有测试,我不相信删除场景有巨大的优势(就像插入/更新一样),除非你有索引,你以后不会保留。 (3认同)

KAS*_*DBA 2

您应该尝试逐块删除它们,可能是在循环中删除,每次删除迭代都是自己的事务,然后在每次循环迭代结束时清除日志。

此外,您还需要找到要用作块中值以删除记录的数字。需要进行彻底的测试,如果能先测试UAT中的chunk值会更好。

关于如何继续,请参考将大型删除操作分成块