当 dbo.IndexOptimize 作业长时间运行并导致阻塞时,如果我们停止该作业,是否会导致重组或重建的所有内容回滚?或者只是停在原地不再继续前进?
我们使用带有 Always On 可用性组的 SQL Server 2017 Enterprise Edition。
当 dbo.IndexOptimize 作业长时间运行并导致阻塞时,如果我们停止该作业,是否会导致重组或重建的所有内容回滚?或者只是停在原地不再继续前进?
我们使用带有 Always On 可用性组的 SQL Server 2017 Enterprise Edition。
正如其他人在评论中所述,如果索引已被 IndexOptimize 作业优化,则该索引上发生的锁定也将结束。(当然,持有索引锁的新事务除外)
回答您的问题
停止 IndexOptimize 作业将导致显示错误消息:
但如果你杀掉当前正在执行索引维护的进程,那么就会导致当前正在优化的索引被回滚。
之前优化过的索引不受影响。仅优化当前索引。
因为您写道这是一个大表/索引,所以回滚过程可能需要与优化/重建索引所用的时间相同的时间。
企业版
鉴于您使用的是 Microsoft SQL Server 2017 企业版,您可能希望在作业中应用该
INDEX_REBUILD_ONLINE
参数IndexOptimize
(...来自 Ola)。使用此选项将告诉 Ola 的作业触发该WITH (ONLINE=ON)
选项。Microsoft 文章Perform Index Operations Online中对此进行了解释:
触发的参数显示在Microsoft Learn 网站上的ALTER INDEX文档中。
OLA IndexOptimize 作业的作业步骤可能类似于以下内容:
这本质上是告诉作业执行以下操作:
ALTER INDEX ... REORGANIZE ...
ALTER INDEX ... REBUILD ... WITH (ONLINE = ON)...
. 如果无法在线重建索引,那么只需重新组织索引即可。ALTER INDEX ... REBUILD ... WITH (ONLINE = ON)...
. 如果无法在线重建索引,则执行ALTER INDEX ... REBUILD ... WITH (ONLINE = OFF) ...
.这应该使您的企业版能够优雅地处理大型索引重建。
长时间运行的 SQL Server 维护进程(如 dbo.IndexOptimize)通常会在您停止时尝试回滚当前操作。根据进程被中断时的运行情况,系统的响应可能涉及资源争用和阻塞。为了最大程度地减少干扰,维护工作通常应安排在活动较少的时间。