Я унаследовал ОЧЕНЬ плохо спроектированную и обслуживаемую базу данных и использовал свои знания SQL Server и немного удачи, поддерживая этот сервер HIGH Availability и не заканчивая сгореть в огне (предыдущий разработчик, который ушел, по сути, просто держалсистема работала 4 года).
Сегодня я столкнулся с очень странной проблемой.Я надеюсь, что кто-то может объяснить мне это, поэтому, если это случится снова, есть способ исправить это.
В любом случае, есть сохраненный процесс, который довольно прост.Он объединяет две таблицы между коротким диапазоном даты / времени (диапазон 5 минут) и передает результаты обратно (этот запрос выполняется каждые 5 минут через службу Windows).Самая большая таблица имеет 100 тысяч строк, самая маленькая таблица имеет 10 тысяч строк.Хранимая процедура очень проста:
ПРИМЕЧАНИЕ. Имена таблиц и столбцов были изменены, чтобы защитить невинных.
SELECT TOP 100 m.*
FROM dbo.mytable1 m WITH (nolock)
INNER JOIN dbo.mytable2 s WITH (nolock) ON m.Table2ID = s.Table2ID
WHERE m.RowActive = 1
AND s.DateStarted <= DATEADD(minute, -5, getdate())
ORDER BY m.DateStarted
Теперь, если я оставлю "TOP 100" взапрос, запрос зависает до тех пор, пока я не остановлю его (работает в SMS или в сохраненном процессе).Если я удаляю TOP 100, запрос работает как запланировано и возвращает 50-ти строчные строки, как и должно быть (мы не хотим, чтобы он возвращал более 100 строк, если мы можем помочь).
Итак,Я провел некоторое исследование, используя sp_who, sp_who2, и посмотрел на master..sysprocesses и использовал DBCC INPUTBUFFER для поиска любых SPID, которые могут быть блокирующими или блокирующими.Без блоков и без блокировок.
Это ТОЛЬКО НАЧИНАЕТСЯ сегодня без изменений в этих двух схемах таблиц и из того, что я понял в последний раз, когда этот запрос / таблицы обрабатывался 3 года назад и работал без ошибок.с тех пор.
Теперь, примечание, и я не знаю, будет ли это как-то связано с этим.Но я переиндексировал обе эти таблицы примерно 24 часа назад, потому что они были фрагментированы на 99% (помните, я говорил, что это плохо спроектированный и плохо обслуживаемый сервер).
Кто-нибудь может объяснить, почему SQL Server 2008 будет делать это?