如何优化SQL Server中SET SINGLE_USER WITH ROLLBACK IMMEDIATE执行性能
优化方案按优先级排序如下:
方案1:调整原有语句执行顺序(官方推荐,无自定义逻辑)
你原有代码的执行顺序存在不必要的开销:先修改目标库属性、再切换到master库,会额外增加连接切换成本。调整顺序后,ALTER DATABASE语句的耗时通常可以从3秒降到数百毫秒:
USE master GO ALTER DATABASE {databaseName} SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO RESTORE DATABASE {databaseName} FROM DATABASE_SNAPSHOT = @snapshotName GO ALTER DATABASE {databaseName} SET MULTI_USER GO
方案2:简化KILL逻辑(无游标,写法更简洁)
如果调整顺序后仍然达不到性能要求,可以用动态SQL批量生成KILL语句替代游标写法,执行效率和你当前的游标版本一致,代码精简很多:
USE master GO DECLARE @killSql NVARCHAR(MAX) = N'' -- 筛选目标库的所有活跃连接,排除当前执行脚本的连接本身 SELECT @killSql += N'KILL ' + CAST(spid AS NVARCHAR(10)) + N'; ' FROM sys.sysprocesses WHERE dbid = DB_ID('{databaseName}') AND spid != @@SPID EXEC sp_executesql @killSql GO
方案3:SQL Server 2016+ 极简方案
如果你的数据库版本为SQL Server 2016及以上,可以直接在快照恢复语句中指定强制回滚参数,不需要额外的踢连接逻辑,代码量最少、执行效率最高:
USE master GO RESTORE DATABASE {databaseName} FROM DATABASE_SNAPSHOT = @snapshotName WITH REPLACE, ROLLBACK IMMEDIATE GO
内容的提问来源于stack exchange,提问作者Aristoteles
相关产品推荐
相关产品推荐

