我有一个非常大的表,需要将架构更改为一列 - 我需要将数据类型从 varchar(50) 扩展到 varchar(100)。我预计这会很快发生,因为列数据类型已经是可变的,并且显然该列中当前没有数据必须更改。但是在命令运行了几分钟后,我决定退后看一看。现在,在杀死 SPID 之后,回滚已经发生了一个多小时(比命令运行的时间长得多)。当我用 statusonly 运行“kill”时,它说:
SPID 82:正在进行事务回滚。预计回滚完成:0%。预计剩余时间:0 秒。
sp_WhoIsActive 将等待显示为 IO_Completion。
为什么回滚ALTER TABLE foo ALTER COLUMN bar varchar(100) NULL
会像这样卡住?列栏现在是 varchar(50)。
更新:大约 3 小时后回滚完成。我仍然想知道为什么这需要这么长时间才能回滚。
这些链接应该有助于解释回滚期间发生的情况:
回滚:当您 KILL 会话时会发生什么?
回滚永远
从这些中得到的一个关键点是回滚通常是单线程的,这通常有助于为什么在发出回滚之前它们可能需要比查询本身最初运行的时间更长的原因。