我们有一个巨大的DML脚本,它打开一个事务并执行许多更改,然后才提交。
所以最近,我已经触发了这个脚本(通过应用程序),并且由于花费了相当长的时间,我已经杀死了会话,这触发了ROLLBACK。
所以问题是这个ROLLBACK花了很长时间而且它占用了大量的CPU(100%利用率),而且当我监视这个会话时(使用exec DMV),我看到很多与IO相关的等待(IO_COMPLETION,PAGE_IO_LATCH等)。
所以我的问题是: 1.为什么回滚需要花费大量时间?是因为它需要将每个恢复更改写入LOG文件吗? IO等待我看到可能与此LOG文件的IO操作有关? 2.我是否可以找到任何在线资源,这解释了ROLLBACK机制的工作原理?
谢谢
答案 0 :(得分:1)
基于SO的DBA方面的另一篇文章,ROLLBACKs因为至少有两个原因而变慢:原始SQL能够是多线程的,其中回滚是单线程的,而两个,一个提交确认已经完成的工作complete,其中回滚不仅必须标识要反转的日志操作,还要定位受影响的行。
https://dba.stackexchange.com/questions/5233/is-rollback-a-fast-operation
答案 1 :(得分:1)
这就是我发现的为什么SQL Server中的ROLLBACK操作可能很耗时以及它为什么会产生大量IO的原因。
背景知识(Open Tran / Log机制): 当对DB进行大量更改作为打开事务的一部分时,这些更改会修改内存中的数据页(脏页),并且生成的日志记录(称为LOG BLOCKS)最初会写入缓冲池(在记忆中)。通过重复检查点操作或延迟写入过程将这些脏页刷新到磁盘。根据SQL Server的预写日志记录机制,在刷新脏页之前,还需要将描述这些更改的LOG RECORDS刷新到磁盘。
记住这些背景知识,现在当事务被回滚时,这几乎就像一个恢复操作,其中所有写入磁盘的更改都必须撤消。因此,我们遇到的大量IO可能因此而发生,因为有大量数据需要撤消。
资讯来源:https://app.pluralsight.com/library/courses/sqlserver-logging/table-of-contents 本课程对SQL Server中日志恢复的工作原理进行了非常详尽的解释。