You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:36:04