尝试在生产中的大型表上启用压缩,但我们现在没时间了(已经运行了 6.5 小时)。
取消操作并让它回滚有什么影响?
试图确定我们是否应该通电并让它完成或杀死它并让它回滚。但是,如果回滚 6.5 小时的操作需要同样长的时间,那么我们可能只想让它完成。
我们在磁盘速度较慢的 QA 中对其进行了测试,它在 4 小时内完成,因此我们不完全确定为什么要花这么长时间。
须知:
- 表大小为 271 GB,大约。3000万行
- 在 3 小时标记处,驱动器已满,我们在大约 40 分钟后将其扩展
- 普遍的等待类型是 IO_Completion
- sp_whoisactive 显示 CPU 和 physical_reads 增加,而读/写在相当长的一段时间内没有移动
- 这是在 SQL Server 2017 标准版、Windows Server 2016 上
这是我们的声明:
ALTER INDEX [PK_t1] ON [dbo].[t1] REBUILD PARTITION = ALL
WITH ( STATISTICS_NORECOMPUTE = OFF, ONLINE = OFF, SORT_IN_TEMPDB = OFF
, MAXDOP = 3, DATA_COMPRESSION = PAGE );
回滚可以是 2 倍、4 倍等,因为即使对于并行操作,回滚也是单线程的。
我的建议是让它完成。你有什么选择?不这样做吗?如果你不能依赖你的 QA 系统给出的估计,我不知道你怎么会有信心重新开始并期待不同的结果。
不要反应过度。如果取消操作,可能需要很长时间才能回滚。如果您认为重新启动服务器可能会使它停止,请再想一想。那只会延长你的痛苦。
检查此查询的结果以了解发生了什么:
将最后一行中的更改
53
为正在进行压缩工作的会话的会话 ID。command
如果会话已经回滚,该列将显示“ROLLBACK”。如果操作正在进行,它会说“ALTER INDEX”,你应该看到reads
并writes
递增。输出类似于:
如果操作正在回滚,您可以通过将
estimated_completion_time
列添加到上面的查询来获得估计的完成时间。请注意,该列不会为索引重建操作显示任何内容。有关列的详细信息,请参见Microsoft Docs页面。