Клиент сообщил о повторяющихся случаях очень странного поведения при выполнении хранимой процедуры.
У них есть код, который запускает кешированную транспозицию изменчивого набора данных. Сохраненная процедура была написана для повторной обработки набора данных по запросу, если:
1. Набор данных изменился с момента последней повторной обработки
2. Набор данных не изменился в течение 5 минут.
(Второе условие останавливает массовый повторный пересчет во время изменений.)
Это работало нормально в течение пары недель, SP требовалось 1-2 секунды для завершения повторной обработки, и он делал это только тогда, когда это требовалось. Потом...
- SP внезапно «перестал работать» (он просто продолжал работать и больше не возвращался)
- Мы тонко изменили SP, и он снова заработал.
- Через несколько дней снова перестал работать
- Затем кто-то сказал: «Мы уже видели это раньше, просто перекомпилируйте SP».
- Без изменений в коде мы перекомпилировали SP, и он заработал.
- Через несколько дней снова перестал работать
Сейчас это повторилось много-много раз. SP внезапно «перестает работать», никогда не возвращается, и время ожидания клиента истекает. (Мы попытались запустить его через студию управления и отменили запрос через 15 минут.)
Однако каждый раз, когда мы перекомпилируем SP, он снова начинает работать.
Я еще не пробовал WITH RECOMPILE с соответствующими операторами EXEC, но я не особо хочу этого делать. Он вызывается сотни раз в час и обычно ничего не делает (он только обрабатывает данные несколько раз в день). Если возможно, я хочу избежать накладных расходов на перекомпиляцию того, что является относительно сложным SP, «просто чтобы избежать того, что «не должно» происходить...
- Кто-нибудь испытал это раньше?
- Есть ли у кого-нибудь предложения, как это побороть?
С уважением,
Дем.
ИЗМЕНИТЬ:
Псевдокод будет следующим:
- читать "а" из table_x
- читать "b" из table_x
- Если (a ‹ b) вернуть
- НАЧАТЬ СДЕЛКУ
- УДАЛИТЬ table_y
- INSERT INTO table_y ‹3 выбирает объединенные вместе>
- ОБНОВЛЕНИЕ table_x
- СОВЕРШИТЬ ТРАНЗАКЦИЮ
Выборы «некрасивые», но когда они выполняются в строке, они выполняются в кратчайшие сроки. В том числе, когда ИП отказывается выполняться. И профилировщик показывает, что это INSERT, на котором SP «зависает».
У SP нет параметров, и sp_lock ничего не показывает, что блокирует процесс.