gpt4 book ai didi

sql-server - 在事务中执行语句而不在该事务中登记它

转载 作者:行者123 更新时间:2023-12-05 07:18:06 24 4
gpt4 key购买 nike

我在批处理中有一些 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 不会以某种方式将自己加入可能回滚的事务中。

我正在寻找一种可以以最可靠的方式实现的解决方案,编码或工作量可能最少,并且对正在分析的脚本的性能影响最小。

编辑

正在分析的脚本非常耗时 - 从一个小时到几天不等 - 我需要能够在事务完成或回滚之前看到中间分析结果。在能够查看日志之前,我不能等待批处理结束。

最佳答案

您可以为此使用表变量。与普通变量一样,表变量不受 ROLLBACK 的影响。您需要将性能日志数据插入表变量,然后在过程结束时将其插入普通表,在所有 COMMITROLLBACK 语句之后。

关于sql-server - 在事务中执行语句而不在该事务中登记它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58495516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com