2012-07-24 3 views
2

У меня есть дорогостоящая хранимая процедура, которая запускается после изменения данных в таблице, чтобы предварительно вычислить некоторые скопления этих данных. (SP вызывается приложением, а не триггером в таблице, если это актуально, хотя это не является жестким требованием). Хранимая процедура почти полностью соответствует заявлению INSERT INTO ... SELECT.Отказ от сохранения исполняемого процесса от другого сеанса/соединения

Данные обычно изменяются нечасто (то есть, вызовы SP нечасты), но они могут в принципе перекрываться. Чтобы обеспечить согласованность в этом случае, я использую sp_getapplock, так что второй вызов будет ждать завершения первого процесса перед продолжением.

Это работает, но ожидание неэффективно и не нужно - первое, что делает моя хранимая процедура, - удалить все существующие (теперь устаревшие) данные. То, что я действительно хочу, - это второй вызов, чтобы рассказать о первом: «Не беспокойтесь о том, что вы делаете, теперь все изменилось - просто перестаньте работать, и я оставлю вещи в правильном состоянии».

Есть ли надежный способ для второго вызова, чтобы надежно прервать первый вызов SP в этом случае?

+0

Возможно, вы попытаетесь получить идентификатор процесса первого процесса, используя sp_who, а затем убейте его? –

ответ

2

Невозможно сделать это изящно. Если вы выдаете «kill» против одного утверждения, вы можете оставить соединение для этого утверждения в неизвестном состоянии. Кроме того, как @GilM справедливо указывает (+1) - откат может занять больше времени, чем завершение, в зависимости от этапа выполнения.

Итак, вот предложение, о котором вы, возможно, и не подумали. Вы думали об использовании индексированного представления? Вы можете использовать их в стандартной версии, но вам нужно запросить их, используя подсказку WITH (NOEXPAND), чтобы воспользоваться преимуществами. Но вы можете просто обернуть это представление в другое, которое включает подсказку.

Таким образом, вы можете быть в состоянии заменить весь процесс с чем-то, что пара действительно хороших преимуществ:

  • Он обновляется для вас, совершенно прозрачно.
  • Это будет намного эффективнее, чем «повторно заполнить весь набор».
+0

Индексированный просмотр сделал бы трюк, так как концептуально это именно то, что я делаю вручную. Спасибо за указатель! –

3

Вам действительно нужно повторно заполнить после каждые изменить?

Будет ли это достаточно хорошим для последующих обновлений, чтобы отложить их до того, что происходит?

Даже если вы можете прервать его, вам придется подождать, пока он откатит транзакцию, что может занять больше времени, чем ждать завершения.

+0

Реагрегация после каждого изменения требуется (так как, как и выше, выходная таблица фактически представляет собой представление по входу). Обычно это происходит только один раз в день, поэтому не слишком обременительно; Я хотел бы оптимизировать случай, когда мы вручную пересчитываем/повторно вводим данные. Спасибо, что указали на стоимость отката, поскольку он, кажется, помещает гвоздь в гроб, делая это через явную синхронизацию. –

Смежные вопросы