正在执行 SQL Server 回滚 - 如何停止它?

And*_*ers 7 sql-server rollback

我有一个查询需要 6000 万行,将它们复制到一个新表中,对它们进行一些更新,然后将它们插入到另一个新表中。这一切都包含在一个事务中。一开始我认为这会很好,但意识到这是一个愚蠢的错误。

虽然它在我的本地实例机器上运行了 7 个小时,但在生产数据库上运行了 2 天多!厌倦了等待并意识到我的解决方案可能不是执行此操作的最佳方法,我关闭了查询窗口并终止了该过程。现在,它正在回滚。

同时,我运行了这个:KILL 60 WITH STATUSONLY 和 EXEC sp_who2 'active'。状态显示“SPID 60:正在进行事务回滚。估计回滚完成:62%。估计剩余时间:31849 秒”。秒和磁盘正在上升,所以我知道它正在尝试进行回滚。它非常缓慢,并且每隔几个小时就会完成一个百分比。

我的问题是,由于我的操作,数据库变得很大并且占用了磁盘空间。此外,我不关心我试图复制到的这两个新表。我想截断/删除它们,然后用更好的方法来解决这个问题。但是,我不能在回滚过程中截断/删除它们?我不太关心这些新表会发生什么。它们也位于自己的文件组和 .ndf 文件中。我只想尽快删除这些,这样我就可以恢复我更好的方法。我正在使用 SQL 2014 并且需要紧急帮助,因为今天是星期六,我不想打扰我的老板!:)

Ray*_*and 7

@MaxVernon已经提供了您需要的所有信息。只是我这边的一些补充。事务越大,SQL Server 的(预)计算就越困难。这就是为什么在进程运行时您的剩余时间(以秒为单位)可能会增加。运行查询后,SQL Server 无法向进程授予更多内存。对于大型计算,您的 tempdb 很可能会被使用。是的,这将导致磁盘密集型调用。这就是为什么几乎总是最好保持交易规模较小的原因。

另请注意,在大多数情况下重新启动 SQL Server 是一个坏主意,因为它有多种负面影响。例如,它将重建 TEMP DB 并清除统计信息......我