是否可以降低作业的 CPU 优先级?

ask*_*otl 3 sql-server sql-server-2014

我想在 SQL Agent 中运行一个后台作业,它将清理大量数据并运行多天。

基本上,一张表会删除4亿条记录。删除在循环中运行,因此总是删除大约 100.000 条记录的批次。

在删除过程中,此表中不会修改任何其他内容。

是否可以降低此类作业的 CPU 优先级,以免降低系统速度?

Dav*_*ett 7

正如上面的评论中所提到的,资源调控器是管理此功能的内置方法,假设您有一个启用此功能的版本。尽管除非您的DELETE操作执行一些复杂的逻辑来确定要删除的内容,否则更改 CPU 优先级不太可能有帮助,因为在这种情况下 IO 将成为主要瓶颈,并且它几乎不会打扰 CPU,所以请查看MAX_IOPS_PER_VOLUME创建资源池时的那个选项。

如果您没有企业版,因此​​无法访问资源调控器,您可以使用WAITFOR DELAY. 如果使用这种更笨拙的手动方法,您可能希望以较小的批次工作,选择可以在短时间内完成的批次大小。如果您工作约 0.1 秒并使用“WAITFOR DELAY '00:00:00.1”,则任务将以大约一半的资源运行(非常接近,除非您很聪明并让任务监控自身并调整批处理大小和/或睡眠延迟动态)。

如果您要删除的内容几乎代表表中的所有数据,您可能会发现将要保留的内容复制到另一个表、截断当前表,然后将保留的数据复制回去会更快,尽管显然这可能会变得更复杂如果你有参照完整性剩下的数据和数据库的整个过程中休息,或在表之间保持受制于任何其他的限制TRUNCATE TABLE。如果您要删除整个表格内容,再次假设您是合适的或可以暂时这样做,那么只需TRUNCATE TABLE.

  • 我最近以类似的方式使用了“WAITFOR DELAY”。将 `DELETE` 语句包装在一个 `BEGIN/COMMIT` 块中,并在它后面加上 `WAITFOR DELAY`。所有这些都在一个“WHILE”循环中。工作得很好。 (2认同)