У меня есть несколько операторов 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
как-то не включится в транзакцию, которая может быть откатана.
Я ищу решение, которое можно реализовать наиболее надежным способом, с наименьшим количеством кода или работы, и с наименьшим влиянием на производительность профилируемого скрипта.
РЕДАКТИРОВАТЬ
Профилируемый сценарий чрезвычайно отнимает много времени - от часа до нескольких дней - и мне нужно иметь возможность видеть промежуточное профилированиерезультаты до завершения транзакции или ее отката. Я не могу позволить себе дождаться окончания партии, прежде чем я смогу просмотреть журналы.