我有一张有点失控的桌子。我本身不是 DBA,但似乎记得一次删除大量行可能会导致事务日志问题,在删除过程中妨碍整体系统性能等......
我是否有一种有效的方法来创建一个作业,以小批量删除记录以过度妨碍其他访问/性能并防止事务日志出现问题?
这个过程可能会很慢,这会有所作为
对于其他上下文,删除标准将基于...之类的东西where x like '%blah%'
。此外,还有 1 个聚集索引和 5 个非聚集索引。
我有一张有点失控的桌子。我本身不是 DBA,但似乎记得一次删除大量行可能会导致事务日志问题,在删除过程中妨碍整体系统性能等......
我是否有一种有效的方法来创建一个作业,以小批量删除记录以过度妨碍其他访问/性能并防止事务日志出现问题?
这个过程可能会很慢,这会有所作为
对于其他上下文,删除标准将基于...之类的东西where x like '%blah%'
。此外,还有 1 个聚集索引和 5 个非聚集索引。
您可以将其分解成块 - 循环删除;每次删除迭代都是自己的事务,然后在每次循环迭代结束时清除日志。找到最佳块大小将需要一些测试。
我建议你看看 Aaron Bertrand 的这篇文章,他解释了细节并针对不同场景运行测试,以显示影响(持续时间、事务日志): http ://sqlperformance.com/2013/03/io-子系统/块删除
至于
where x like '%blah%'
删除条件 - 它会使查询不可搜索(不能利用索引进行索引查找)。因此,即使您有一个索引来支持 columnx
,它也将是一次扫描。资源:
这相当简单。这是一个让您测试的框架。
编辑:当然,打开通配符搜索对于查找行来说是出了名的差,因为必须搜索整个列。此外,正如 Aaron 的帖子中所指出的,您还需要管理日志,要么处于简单模式,要么进行日志备份,以防止日志文件过度增长。