【发布时间】:2019-10-22 00:00:53
【问题描述】:
我希望对批处理中的一些 SQL 语句进行性能分析。为此,我创建了一个记录执行时间的存储过程。
但是,我还希望能够回滚主批处理执行的更改,同时仍保留性能日志。
另一种方法是运行批处理,将性能数据复制到另一个数据库,从备份中恢复数据库,重新应用我想要分析的所有更改,再加上更多,然后重新开始。这比不包括登录事务的行为更耗时。
假设我们有这种情况:
BEGIN TRANSACTION
SET @StartTime = SYSDATETIME
-- Do stuff here
UPDATE ABC SET x = fn_LongRunningFunction(x)
EXECUTE usp_Log 'Do stuff', @StartTime
SET @StartTime = SYSDATETIME
-- Do more stuff here
EXEC usp_LongRunningSproc()
EXECUTE usp_Log 'Do more stuff', @StartTime
ROLLBACK
我如何才能将usp_Log 保存到表中的结果持久化,而不会将它们与事务中其他地方发生的更改一起回滚?
在我看来,理想情况下 usp_Log 不会以某种方式将自己加入可能回滚的事务中。
我正在寻找一种能够以最可靠的方式实施、编码或工作量最少、对所分析脚本的性能影响最小的解决方案。
编辑
正在分析的脚本非常耗时 - 从一个小时到几天不等 - 我需要能够在事务完成或回滚之前看到中间分析结果。我无法等待批处理结束才能查看日志。
【问题讨论】:
标签: sql-server tsql transactions sql-server-2017